Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 数据帧在分区中重复_Apache Spark_Apache Spark Sql - Fatal编程技术网

Apache spark 数据帧在分区中重复

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

我有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(序列(“散列”))
这样可以很好地删除重复项

但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
上分组,然后从
散列中删除重复数据?这不也是你的问题吗?你在这里不是也在做同样的事吗?对,这也是我的问题。但到目前为止,我找不到一个直接的解决办法。问题是你没有接受这个答案,也没有评论为什么它对你不起作用。这使得这是一个重复的问题,我不能接受答案,因为单一的答案根本没有帮助,并通过对问题的评论进行了讨论。