这个问题在这里已经有了答案:
How to select the first row of each group?
(9 个回答)
5年前关闭。
假设我有一个 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 特定的操作可以做到这一点?感谢一些帮助,谢谢。
最佳答案
您可以在 sparksql 中使用窗口函数来实现这一点。
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
这将实现您所需要的。
阅读更多关于窗口函数支持 https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html
关于scala - Spark 从 DataFrame 中删除重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35498162/