【问题标题】:Spark: Joining DataframesSpark:加入数据框
【发布时间】:2015-09-16 21:48:58
【问题描述】:

我需要加入两个DataFrames如下:

  1. 如果键匹配,则从右侧获取值。
  2. 如果左侧的键在右侧不存在。从左侧取值。
  3. 如果右侧的键在左侧不存在。从右边取值。

使用 DataFrame 执行此操作的最佳方法是什么?以前我曾经使用 RDD 的“cogroup”方法来执行此操作,这在 DataFrames 上不可用。

【问题讨论】:

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


    【解决方案1】:

    您可以简单地执行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 1.4.0 shell。但是当我尝试在我的 Scala 程序中使用它时,'toDF' 方法不适用于 RDD 类。我正在使用 spark-core_2.10-1.4.0.jar。有什么想法吗?
    • 首先你还需要spark-sql。除此之外,您必须导入`sqlContext.implicits`,其中sqlContext 是您选择的SQLContext
    • 我也有 spark-sql_2.10(版本 1.4.0),但 SQLContext.implicits 不可用。无论如何,我能够以不同的方式创建一个 DataFrame,所以我会接受这个答案。感谢您的帮助。
    • 从 1.3 开始可用:val sqlContext = new SQLContext(sc); import sqlContext.implicits._。见:spark.apache.org/docs/1.5.0/api/scala/…
    猜你喜欢
    • 2017-08-19
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多