这是火花的bug吗?连接两个数据框后结果为空

时间:2018-08-17 01:35:49

标签: apache-spark apache-spark-sql self-join

某些人可能会认为我在抄袭其他人,因此我将在这里进行解释。这两个问题似乎是相同的,但是我尝试了答案,但它们都不对我有用。如果您不相信我,可以尝试一下


我在本地模式下使用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的错误还是其他原因?

0 个答案:

没有答案