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

我不熟悉Spark和Scala。我在读Spark的distinct()函数。但我找不到任何适当的细节。我有一些无法解决的疑问,我已经记下来了

  • Spark中如何实现distinct()

    我不太擅长使用Spark源代码来识别整个流程。 当我检查执行计划时,我只能看到一个Shufferdd

  • distinct的时间复杂度是多少

    我还从谷歌搜索中发现,它还以某种方式使用哈希和排序

    所以,我想它是否使用了与借助Hashset从数组中获取唯一元素相同的原理。 如果是一个系统,我会猜到时间复杂度是O(nlogn)

    但它分布在许多分区中,并被洗牌,时间复杂度的顺序是什么

  • 有没有办法避免在特定情况下出现混乱

    如果我确保按照我的用例正确地划分数据, 我可以避免洗牌吗

    i、 例如,假设在dataframe中分解具有唯一行的ArrayType列将创建新行,其他列将被复制。 我将选择其他列。 通过这种方式,我确保每个分区的副本是唯一的。 因为我知道每个分区的副本是唯一的, 我可以避免洗牌,只需在该分区中尖锐地删除重复项

  • 我也发现了这个

    谢谢你的帮助。 如果我哪里做错了,请纠正我

    Spark中如何实现distinct()

    通过使用
    None
    值应用虚拟聚合。粗略地

    rdd.map((_, None)).reduceByKey((a, b) => a)
    
    distinct的时间复杂度是多少

    考虑到整个过程的复杂性,很难估计。它至少是O(N logn),因为洗牌需要排序,但考虑到构建额外的非核心数据结构(包括关联数组)所需的多个其他操作,数据的序列化/反序列化可能更高,并且在实践中由IO操作控制,而不是纯算法复杂性

    有没有办法避免在特定情况下出现混乱

    是,如果保证将潜在的副本放在同一分区上

    您可以使用
    mapPartitions
    来删除数据,尤其是当数据已排序或以其他方式保证在孤立的邻域中有重复数据时。如果不这样做,您可能会受到内存需求的限制,除非您接受概率过滤器(如Bloom过滤器)的近似结果


    一般来说,虽然这是不可能的,但这样的操作将是非本地的。

    您好,欢迎使用堆栈溢出。有关如何提问和相应更新您的问题的更多详细信息,请参阅链接。我们将尽快这样做。谢谢。我学到了很多。我将尝试更多地了解您在回答中提到的概念。