Spark从DataFrame中删除重复的行

时间:2016-02-19 05:46:53

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

假设我有一个DataFrame,如:

val json = sc.parallelize(Seq("""{"a":1, "b":2, "c":22, "d":34}""","""{"a":3, "b":9, "c":22, "d":12}""","""{"a":1, "b":4, "c":23, "d":12}"""))
val df = sqlContext.read.json(json)

我想根据列“b”的值删除列“a”的重复行。即,如果列“a”有重复的行,我想保留“b”值较大的行。对于上面的例子,在处理之后,我只需要

  

{“a”:3,“b”:9,“c”:22,“d”:12}

  

{“a”:1,“b”:4,“c”:23,“d”:12}

Spark DataFrame dropDuplicates API似乎不支持此功能。使用RDD方法,我可以执行map().reduceByKey(),但是有什么DataFrame特定操作可以执行此操作?

感谢一些帮助,谢谢。

1 个答案:

答案 0 :(得分:9)

你可以在sparksql中使用window函数来实现这个目的。

df.registerTempTable("x")
sqlContext.sql("SELECT a, b,c,d  FROM( SELECT *, ROW_NUMBER()OVER(PARTITION BY a ORDER BY b DESC) rn FROM x) y WHERE rn = 1").collect

这将实现您的需求。 阅读更多关于Window function suupport https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html

的信息