代码之家  ›  专栏  ›  技术社区  ›  addmeaning

如何在Spark 2.3.0中减去两个保持重复的数据帧

  •  0
  • addmeaning  · 技术社区  · 7 年前

    Spark 2.4.0引入了新的便捷功能 exceptAll 它允许减去两个数据帧,保留重复的数据帧。

    实例

      val df1 = Seq(
        ("a", 1L),
        ("a", 1L),
        ("a", 1L),
        ("b", 2L)
      ).toDF("id", "value")
      val df2 = Seq(
        ("a", 1L),
        ("b", 2L)
      ).toDF("id", "value")
    
    df1.exceptAll(df2).collect()
    // will return
    
    Seq(("a", 1L),("a", 1L))
    

    但是我只能使用Spark 2.3.0。

    仅使用Spark 2.3.0中的函数实现此功能的最佳方法是什么?

    0 回复  |  直到 7 年前
        1
  •  2
  •   Vamsi Prabhala    7 年前

    一种选择是使用 row_number 生成序列号列并在 left join 以获取缺少的行。

    PySpark解决方案如图所示。

     from pyspark.sql.functions import row_number
     from pyspark.sql import Window
     w1 = Window.partitionBy(df1.id).orderBy(df1.value)
     w2 = Window.partitionBy(df2.id).orderBy(df2.value)
     df1 = df1.withColumn("rnum", row_number().over(w1))
     df2 = df2.withColumn("rnum", row_number().over(w2))
     res_like_exceptAll = df1.join(df2, (df1.id==df2.id) & (df1.val == df2.val) & (df1.rnum == df2.rnum), 'left') \
                             .filter(df2.id.isNull()) \ #Identifies missing rows 
                             .select(df1.id,df1.value)
     res_like_exceptAll.show()