【问题标题】:Spark 2 step joinSpark 2 步加入
【发布时间】:2017-12-22 13:06:34
【问题描述】:

我有两个希望基于两个键加入的数据框。如果没有匹配,我也想只根据key 1引入一个匹配(key 1可能有多个记录,可以选择任何一个,但只能引入一个记录)

像这样:

    val df1 = spark.sparkContext.parallelize( List( ("k0","k00","v0"),
    ("k1","k11","v1"),("k2","k22","v2") ) 
    ).toDF("key1","key2","val_type_a")

    val df2 = spark.sparkContext.parallelize( List( ("k0","k00","X"),
    ("k1","XX","Y"),("k1","YY","Z"),("k2","ZZ","W") ) 
    ).toDF("key1","key2","val_type_b")



    val df1_df2=df1.join(df2,Seq("key1","key2"),"left")
    df1.show
    df1_df2.show

但是对于 k1 和 k2 行,我希望 val_type_b 也被填充,因为仅基于键 1 的部分匹配可用 - 对于 k1,它可以是 Y 或 Z,而对于 k2,它是 W。 最有效的方法是什么?

【问题讨论】:

    标签: apache-spark join dataframe


    【解决方案1】:

    您可以在 2 列中执行此操作:首先您在 2 列上加入,然后在 1 列中加入剩余的列。

    一旦你完成了第一个加入,你可以在 df2 上使用 groupBy + first 来只保留一个值(第一个)

    var df2_single = df2.groupby("key1).agg(first("val_type_b").alias("val_type_b"))
    

    选择缺失值(第一次连接不起作用的地方):

    var missing = df1_df2.filter(col("val_types_b").isNull).drop("val_types_2")
    

    然后再做你的左连接:

    var df1_df2_missing = missing.join(df2_single, "key1", "left" )
    

    将第一次加入和第二次加入的结果合并:

    df1_df2 = df1_df2.filter(col("val_types_b").isNotNull).union(df1_df2_missing)
    

    【讨论】:

      猜你喜欢
      • 2015-01-15
      • 2021-09-08
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 2019-04-08
      • 2017-08-28
      • 2018-01-14
      • 2016-02-28
      相关资源
      最近更新 更多