某些人可能会认为我在抄袭其他人,因此我将在这里进行解释。这两个问题似乎是相同的,但是我尝试了答案,但它们都不对我有用。如果您不相信我,可以尝试一下
我在本地模式下使用Spark 2.1.0。
1,首先,按如下所示的并行化顺序创建三个数据帧,
import sqlContext.implicits._
var df1 = sc.parallelize(Seq.fill(2)(0)).toDF()
var df2 = sc.parallelize(Seq.fill(2)(0)).toDF()
var df3 = sc.parallelize(Seq.fill(2)(0)).toDF()
df1.show()
+-----+
|value|
+-----+
| 0|
| 0|
+-----+
其他两个数据框的内容与上面相同。
2,我为每个数据框添加一列。
df1 = df1.withColumn("day", lit(1))
df2 = df2.withColumn("day", lit(2))
df3 = df3.withColumn("day", lit(3))
df1.show()
+-----+---+
|value|day|
+-----+---+
| 0| 1|
| 0| 1|
+-----+---+
3,然后我合并所有数据框并得到以下结果,
val df = df1.union(df2).union(df3)
df.show()
+-----+---+
|value|day|
+-----+---+
| 0| 1|
| 0| 1|
| 0| 2|
| 0| 2|
| 0| 3|
| 0| 3|
+-----+---+
4,在“天”列中添加1以获取新的数据框,
var _df = df.withColumn("day", col("day") + 1)
_df.show()
+---+-----+
|day|value|
+---+-----+
| 2| 0|
| 2| 0|
| 3| 0|
| 3| 0|
| 4| 0|
| 4| 0|
+---+-----+
5,最后,根据“天”列将两个表连接在一起。
df.join(_df,"day")
.show()
预期结果应如下获得
+---+-----+-----+
|day|value|value|
+---+-----+-----+
| 2| 0| 0|
| 2| 0| 0|
| 2| 0| 0|
| 2| 0| 0|
| 3| 0| 0|
| 3| 0| 0|
| 3| 0| 0|
| 3| 0| 0|
+---+-----+-----+
相反,我得到了以下结果,
+---+-----+-----+
|day|value|value|
+---+-----+-----+
+---+-----+-----+
结果数据为空!这是火花的错误吗? 但是,当我在第3步和第4步之间添加了缓存“ df.cache()”时,结果是正确的。我查阅了很多信息,发现了一个非常相似的情况。
链接在Self-join not working as expected with the DataFrame API
尽管两者相似,但它们的答案似乎不适用于我的问题。有人知道这是Spark的错误还是其他原因?