Spark DataFrame / Dataset组通过bucketBy优化

时间:2019-05-18 07:52:54

标签: apache-spark group-by query-optimization parquet bucket

我正在研究一个用例的选项,在该用例中,我们将数据集存储为实木复合地板文件,并希望稍后在读取数据时对特定的键运行有效的groupBy查询。

我已经阅读了一些有关groupBy的优化的信息,但是实际上并没有找到太多(除了RDD级别的reduceByKey之外)。 我要记住的是,如果数据集是由也将在groupBy中使用的键存储的。从理论上讲,可以对groupBy进行优化,因为所有包含该键的行都将位于同一位置(甚至还可以连续存储,如果它也存储在同一键上)。

我想到的一个想法是先通过mapPartitions然后再通过groupBy来应用转换,但是这将需要将我的函数分解为两个,这并不是很理想。我相信对于某些类的函数(例如总和/计数),spark也会以类似的方式优化查询,但是优化将通过选择函数来启动,并且无论行在同一位置都可以工作,但不是因为同一地点。

spark可以通过随后使用任何函数来利用行的并置位置来优化groupBy吗?

2 个答案:

答案 0 :(得分:1)

存储桶的主要用例似乎是在存储桶的键上执行JOIN,这使Spark可以避免在整个表中进行洗牌。如果Spark知道行已经在存储桶中进行了分区,那么我不明白为什么不知道在GROUP BY中使用预先分区的存储桶。不过,您可能还需要按组对键进行排序。

我对这个用例也很感兴趣,因此将尝试一下,看看是否发生了改组。

答案 1 :(得分:-1)

太难思考了。

不需要mapPartitions。

bucketBy通常用于后续的JOIN,但是使用where子句加和的总和将大大减少所需的改组。实木复合地板也呈圆柱状,而且速度也很快。

答案是肯定的,尽管后面的问题陈述不清楚。