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