Scala Spark从数据帧中删除重复行

Scala Spark从数据帧中删除重复行,scala,apache-spark,dataframe,apache-spark-sql,Scala,Apache Spark,Dataframe,Apache Spark Sql,假设我有一个数据帧,如: 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”的重复行。i、 e,如果列“a”有重复的行,我希望保留“b”值较大的行。对于上面的

假设我有一个数据帧,如:

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”的重复行。i、 e,如果列“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()
,但是有什么特定于数据帧的操作可以做到这一点呢


感谢您的帮助。

您可以使用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
这将实现你所需要的。
了解有关窗口函数suupport的更多信息

您是如何决定保留哪些c和d值的?如果你想要最大值,那么像df.groupBy(“a”).max(“a”、“b”、“c”)这样的东西就可以了。我不是在寻找“c”和“d”的最大值。只需要与max(“b”)一起填写“a”一行。谢谢!但这给了我一个例外<代码>失败:预期为“`”),但发现“(”在
附近(
似乎需要升级到1.4(或更高版本)我运行的是1.6.0。它给了我一个异常
org.apache.spark.sql.AnalysisException:无法解析窗口函数“row_number”。请注意,使用窗口函数当前需要一个HiveContext;
当我遵循常规DF不支持窗口函数中的示例时,您似乎需要使用hive重建spark支持。