【发布时间】:2015-09-16 21:48:58
【问题描述】:
我需要加入两个DataFrames如下:
- 如果键匹配,则从右侧获取值。
- 如果左侧的键在右侧不存在。从左侧取值。
- 如果右侧的键在左侧不存在。从右边取值。
使用 DataFrame 执行此操作的最佳方法是什么?以前我曾经使用 RDD 的“cogroup”方法来执行此操作,这在 DataFrames 上不可用。
【问题讨论】:
标签: apache-spark dataframe apache-spark-sql
我需要加入两个DataFrames如下:
使用 DataFrame 执行此操作的最佳方法是什么?以前我曾经使用 RDD 的“cogroup”方法来执行此操作,这在 DataFrames 上不可用。
【问题讨论】:
标签: apache-spark dataframe apache-spark-sql
您可以简单地执行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|
## +---+---+
【讨论】:
spark-sql。除此之外,您必须导入`sqlContext.implicits`,其中sqlContext 是您选择的SQLContext。
val sqlContext = new SQLContext(sc); import sqlContext.implicits._。见:spark.apache.org/docs/1.5.0/api/scala/…