首页 文章

Spark中的数据过滤

提问于
浏览
0

我正在尝试使用Spark进行某种过滤 . 我有一个如下所示的数据框:

ID   Property#1   Property#2   Property#3
-----------------------------------------
01   a            b            c
01   a            X            c
02   d            e            f
03   i            j            k
03   i            j            k

我希望给定ID的属性是相同的 . 在上面的示例中,我想过滤掉以下内容:

ID   Property#2
---------------
01   b
01   X

请注意,只要属性相同(例如,第一个表中的ID为'03'),就可以在数据框中重复ID . 代码需要尽可能高效,因为我计划将其应用于具有> 10k行的数据集 . 我尝试使用DataFrame API中的 distinct 函数提取不同的行,使用 groupBy 将它们分组到ID列,并使用 countDistinct 函数聚合结果,但遗憾的是我无法获得代码的工作版本 . 我实现它的方式似乎也很慢 . 我想知道是否有人可以提供一些关于如何解决这个问题的指示 .

谢谢!

1 回答

  • 0

    例如,您可以聚合和加入 . 首先,您必须创建一个查找表:

    val df = Seq(
      ("01", "a", "b", "c"), ("01", "a", "X", "c"),
      ("02", "d", "e", "f"), ("03", "i", "j", "k"),
      ("03", "i", "j", "k")
    ).toDF("id", "p1", "p2", "p3")
    
    val lookup = df.distinct.groupBy($"id").count
    

    然后过滤记录:

    df.join(broadcast(lookup), Seq("id"))
    
     df.join(broadcast(lookup), Seq("id")).where($"count" !== 1).show
     // +---+---+---+---+-----+
     // | id| p1| p2| p3|count|
     // +---+---+---+---+-----+
     // | 01|  a|  b|  c|    2|
     // | 01|  a|  X|  c|    2|
     // +---+---+---+---+-----+
    

相关问题