Spark中的数据过滤

时间:2016-04-08 22:56:22

标签: scala apache-spark

我正在尝试使用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 :(得分: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|
 // +---+---+---+---+-----+