假设我有一个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特定操作可以执行此操作?
感谢一些帮助,谢谢。
答案 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
的信息