如何连接具有不同行数的数据帧

时间:2016-02-03 10:56:34

标签: scala apache-spark spark-dataframe

我有两个行数不同的数据框,例如:

val df = sc.parallelize(Array((0, 1.0, 0.4, 0.1),
                               (1, 0.9, 0.3, 0.3),
                               (2, 0.2, 0.9, 0.2),
                               (3, 0.9, 0.2, 0.2)))
                               .toDF("id", "prop1", "prop2", "prop3")

val df2 = sc.parallelize(Array((0, 3.0, 0.2, 0.1),
                               (1, 0.9, 0.3, 0.3),
                               (2, 0.2, 0.5, 0.2),
                               (3, 0.8, 0.1, 0.1),
                               (4, 0.3, 0.5, 0.5)))
                               .toDF("id", "prop1", "prop2", "prop3")

我想使用id列作为键加入两者,所以我这样做:

val joined = df2.join(df, df("id")===df2("id"), "leftouter")

joined.show()

+---+-----+-----+-----+----+-----+-----+-----+
| id|prop1|prop2|prop3|  id|prop1|prop2|prop3|
+---+-----+-----+-----+----+-----+-----+-----+
|  0|  3.0|  0.2|  0.1|   0|  1.0|  0.4|  0.1|
|  1|  0.9|  0.3|  0.3|   1|  0.9|  0.3|  0.3|
|  2|  0.2|  0.5|  0.2|   2|  0.2|  0.9|  0.2|
|  3|  0.8|  0.1|  0.1|   3|  0.9|  0.2|  0.2|
|  4|  0.3|  0.5|  0.5|null| null| null| null|
+---+-----+-----+-----+----+-----+-----+-----+

此时有两个问题:

  • 为什么添加第二个id列?我怎么能摆脱它?
  • 如何将空值设为零?

2 个答案:

答案 0 :(得分:1)

摆脱第二个" id"列,首先重命名:

val df = sc.parallelize(Array((0, 1.0, 0.4, 0.1),
                               (1, 0.9, 0.3, 0.3),
                               (2, 0.2, 0.9, 0.2),
                               (3, 0.9, 0.2, 0.2)))
                               .toDF("id2", "prop1", "prop2", "prop3")

我还重命名了其他列的名称以避免含糊不清(以及AnalysisException)。

val df2 = sc.parallelize(Array((0, 3.0, 0.2, 0.1),
                               (1, 0.9, 0.3, 0.3),
                               (2, 0.2, 0.5, 0.2),
                               (3, 0.8, 0.1, 0.1),
                               (4, 0.3, 0.5, 0.5)))
                               .toDF("id", "prop1_2", "prop2_2", "prop3_2")

现在,drop不受欢迎的id2

val joined = df2.join(df, df("id2")===df2("id"), "outer").drop("id2")

要在空值的情况下提供默认值,请使用nafill

joined.na.fill(0).show

+---+-------+-------+-------+-----+-----+-----+
| id|prop1_2|prop2_2|prop3_2|prop1|prop2|prop3|
+---+-------+-------+-------+-----+-----+-----+
|  0|    3.0|    0.2|    0.1|  1.0|  0.4|  0.1|
|  1|    0.9|    0.3|    0.3|  0.9|  0.3|  0.3|
|  2|    0.2|    0.5|    0.2|  0.2|  0.9|  0.2|
|  3|    0.8|    0.1|    0.1|  0.9|  0.2|  0.2|
|  4|    0.3|    0.5|    0.5|  0.0|  0.0|  0.0|
+---+-------+-------+-------+-----+-----+-----+

有几种方法可以拨打fill,您可以在API documentation中阅读。在我提供的示例中,fill(0)使用值0替换数字列中的空值。

答案 1 :(得分:0)

只需添加到托雷斯答案,您就可以只选择要显示的内容。这样的事情: -

joined.select(df2("id"), df("prop1"),df("prop2"),df("prop3")).na.fill(0).show()