我是 Spark 和 Scala 的新手。我正在阅读 Spark 的 distinct() 函数。但我找不到任何适当的细节。我有一些我无法解决的疑问,并已将它们写下来。
在 Spark 中如何实现 distinct() ?
我不太擅长使用 Spark 源代码来识别整个流程。当我检查执行计划时,我只能看到一个 ShuffleRDD
distinct 的时间复杂度是多少?
我还从 Google 搜索中发现,它还以某种方式使用了散列和排序。
所以,我想它是否使用与在 Hashset 的帮助下从数组中获取唯一元素相同的原理。如果它是一个系统,我会猜到时间复杂度是 O(nlogn) 。
但是它分布在许多分区中并被打乱,时间复杂度的顺序是什么?
有没有办法避免在特定情况下改组?
如果我确保按照我的用例正确分区我的数据,我可以避免改组吗?
即,例如,假设在具有唯一行的数据框中分解一个 ArrayType 列会创建新行,而其他列被复制。我将选择其他列。通过这种方式,我确保每个分区的重复项都是唯一的。因为我知道每个分区的重复项是唯一的,所以我可以避免洗牌,只是敏锐地删除该分区中的重复项
我还发现这是否 spark 的 distinct() 函数只对每个分区中的不同元组进行洗牌。
谢谢你的帮助 。如果我在任何地方错了,请纠正我。
我正在与其他用户共享的集群上使用 Spark。所以仅仅根据运行时间来判断我的哪一个代码运行效率更高是不可靠的。因为当我运行更高效的代码时,其他人可能会运行大量数据,并使我的代码执行更长时间。
那么我可以在这里问两个问题吗:
我正在使用joinfunction 来 join 2RDDs并且我尝试groupByKey()在 using 之前使用join,如下所示:
rdd1.groupByKey().join(rdd2)
Run Code Online (Sandbox Code Playgroud)
似乎花了更长的时间,但是我记得当我使用 Hadoop Hive 时,group by 让我的查询运行得更快。由于 Spark 使用惰性求值,我想知道groupByKeybefore是否join会让事情变得更快
我注意到Spark有一个SQL模块,到目前为止我真的没有时间尝试它,但是我可以问一下SQL模块和RDD SQL类似功能之间有什么区别吗?