Scala Spark distinct的实现
我不熟悉Spark和Scala。我在读Spark的distinct()函数。但我找不到任何适当的细节。我有一些无法解决的疑问,我已经记下来了Scala Spark distinct的实现,scala,sorting,apache-spark,dataframe,apache-spark-sql,Scala,Sorting,Apache Spark,Dataframe,Apache Spark Sql,我不熟悉Spark和Scala。我在读Spark的distinct()函数。但我找不到任何适当的细节。我有一些无法解决的疑问,我已经记下来了 Spark中如何实现distinct() 我不太擅长使用Spark源代码来识别整个流程。 当我检查执行计划时,我只能看到一个Shufferdd distinct的时间复杂度是多少 我还从谷歌搜索中发现,它还以某种方式使用哈希和排序 所以,我想它是否使用了与借助Hashset从数组中获取唯一元素相同的原理。 如果是一个系统,我会猜到时间复杂度是O(nlogn
None
值应用虚拟聚合。粗略地
rdd.map((_, None)).reduceByKey((a, b) => a)
distinct的时间复杂度是多少
考虑到整个过程的复杂性,很难估计。它至少是O(N logn),因为洗牌需要排序,但考虑到构建额外的非核心数据结构(包括关联数组)所需的多个其他操作,数据的序列化/反序列化可能更高,并且在实践中由IO操作控制,而不是纯算法复杂性
有没有办法避免在特定情况下出现混乱
是,如果保证将潜在的副本放在同一分区上
您可以使用mapPartitions
来删除数据,尤其是当数据已排序或以其他方式保证在孤立的邻域中有重复数据时。如果不这样做,您可能会受到内存需求的限制,除非您接受概率过滤器(如Bloom过滤器)的近似结果
一般来说,虽然这是不可能的,但这样的操作将是非本地的。您好,欢迎使用堆栈溢出。有关如何提问和相应更新您的问题的更多详细信息,请参阅链接。我们将尽快这样做。谢谢。我学到了很多。我将尝试更多地了解您在回答中提到的概念。