关于 spark 中的 partitions

2017-11-17 09:50:49 +08:00
 ufo22940268

环境

问题

In [7]: spark.sql('select time from userlogs where date = "2017-10-27"').rdd.getNumPartitions()
Out[7]: 164

In [8]: spark.sql('select time from userlogs where date = "2017-10-27" limit 100').rdd.getNumPartitions()
Out[8]: 1

为什么不加 limit 的 partition 是 164, 为什么加了 limit 的 partition 是 1. 我很费解.

还有就是 spark-sql 进行查询的时候的 partition 的数量是由什么决定的

2865 次点击
所在节点    Hadoop
4 条回复
imherer
2017-11-17 10:03:50 +08:00
我还以为是大疆😂
ihainan
2017-11-17 10:08:04 +08:00
Spark Core 熟悉点,Spark SQL 不熟就只能飘过了……
yunkchen
2017-11-17 10:12:48 +08:00
加了 limit,spark 就会尽量遍历少的 partition 来查找结果,从而尽快给出查询结果;
一次操作生成一个 RDD,而一个 RDD 可以分为多个 partitions,从而分布在多台机器上。
kex0916
2017-11-17 11:39:46 +08:00
对于 limit 操作,spark 的处理方式是对 RDD 的每个分区 take(limit),然后将每个分区 take 后的 RDD 转换成 SinglePartition 的 ShuffledRowRDD,然后再对每个分区 take(limit),由于只有一个分区,因此结果就是最终的 limit 结果。
因此就明白为啥 limit 后 RDD 分区数量为 1 了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/407123

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX