Apache spark 数据帧在分区中重复
我有10亿行数据帧。 模式是Apache spark 数据帧在分区中重复,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有10亿行数据帧。 模式是 -------------------------- action_id , hash , user_no -------------------------- click , go4grf , 1 click , ferfg43 , 2 view , erioer , 3 view , erioer , 3 view , oijnvio , 4 ... many many rows... 现在我想删除基于哈希列的重复项 df.dropDuplicates
--------------------------
action_id , hash , user_no
--------------------------
click , go4grf , 1
click , ferfg43 , 2
view , erioer , 3
view , erioer , 3
view , oijnvio , 4
... many many rows...
现在我想删除基于哈希列的重复项
df.dropDuplicates(序列(“散列”))
这样可以很好地删除重复项
但Is效率不高,因为哈希值只能在同一操作id中重复。它将在执行器之间洗牌所有数据
所以我想,如果我可以在每个分区中删除副本,这将有助于提高性能
类似于
dataframeList=df.splitByColumnValue(“操作id”)
//按某个字段的值将数据帧拆分为多个数据帧
deduplicatedDf=dataframeList.foreach(df=>df.dropDuplicates(“hash”)).join()
//删除每个数据帧的副本,然后将其连接到一个df。
我知道这不是火花代码。但任何人都知道如何在spark scala api中实现上述功能
如果我可以在每个分区中删除副本,这将有助于提高性能
撇开性能不谈,它不会解决您的问题。除非您可以确保数据是按操作\u id
分区的(这通常需要先进行洗牌),否则您仍然需要进行完全洗牌以删除重复项
如果洗牌不是关键的话,dropDuplicates
已经接近最佳状态。如果您分析执行计划:
== Physical Plan ==
SortAggregate(key=[hash#48], functions=[first(action_id#47, false), first(user_no#49, false)])
+- *Sort [hash#48 ASC NULLS FIRST], false, 0
+- Exchange hashpartitioning(hash#48, 200)
+- SortAggregate(key=[hash#48], functions=[partial_first(action_id#47, false), partial_first(user_no#49, false)])
+- *Sort [hash#48 ASC NULLS FIRST], false, 0
+- LocalTableScan [action_id#47, hash#48, user_no#49]
您将看到它应用了本地重复数据消除(
partial\u first
),并且可以使用基于排序的方法。您是否可以尝试在action\u id
上分组,然后从散列中删除重复数据?这不也是你的问题吗?你在这里不是也在做同样的事吗?对,这也是我的问题。但到目前为止,我找不到一个直接的解决办法。问题是你没有接受这个答案,也没有评论为什么它对你不起作用。这使得这是一个重复的问题,我不能接受答案,因为单一的答案根本没有帮助,并通过对问题的评论进行了讨论。