Spark:加入Dataframes

时间:2015-09-16 21:48:58

标签: apache-spark dataframe apache-spark-sql

我需要加入两个DataFrame,如下所示:

  1. 如果键匹配,请从右侧获取值。
  2. 如果右侧不存在左侧的键。从左边取值。
  3. 如果左侧不存在右侧的键。从右边取值。
  4. 使用DataFrames执行此操作的最佳方法是什么?以前我曾经使用RDD的'cogroup'方法来做到这一点,这在DataFrames上是不可用的。

1 个答案:

答案 0 :(得分:9)

您只需执行FULL OUTER JOIN并使用COALESCE

即可
import org.apache.spark.sql.functions.coalesce

val dfLeft = sc.parallelize(Seq((2, "2L"), (3, "3L"))).toDF("kl", "vl")
dfLeft.show

## +---+---+
## | kl| vl|
## +---+---+
## |  2| 2L|
## |  3| 3L|
## +---+---+

val dfRight = sc.parallelize(Seq((1, "1R"), (3, "3R"))).toDF("kr", "vr")
dfRight.show

## +---+---+
## | kr| vr|
## +---+---+
## |  1| 1R|
## |  3| 3R|
## +---+---+

dfLeft
  .join(dfRight, $"kl" === $"kr", "fullouter")
  .select(coalesce($"kl", $"kr").alias("k"), coalesce($"vr", $"vl").alias("v"))
  .show

## +---+---+
## |  k|  v|
## +---+---+
## |  1| 1R|
## |  2| 2L|
## |  3| 3R|
## +---+---+