V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ufo22940268
V2EX  ›  Hadoop

关于 spark 中的 partitions

  •  
  •   ufo22940268 · 2017-11-17 09:50:49 +08:00 · 2715 次点击
    这是一个创建于 2323 天前的主题,其中的信息可能已经有所发展或是发生改变。

    环境

    • hive
    • spark
    • hadoop

    问题

    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 的数量是由什么决定的

    4 条回复    2017-11-17 11:39:46 +08:00
    imherer
        1
    imherer  
       2017-11-17 10:03:50 +08:00
    我还以为是大疆😂
    ihainan
        2
    ihainan  
       2017-11-17 10:08:04 +08:00
    Spark Core 熟悉点,Spark SQL 不熟就只能飘过了……
    yunkchen
        3
    yunkchen  
       2017-11-17 10:12:48 +08:00   ❤️ 1
    加了 limit,spark 就会尽量遍历少的 partition 来查找结果,从而尽快给出查询结果;
    一次操作生成一个 RDD,而一个 RDD 可以分为多个 partitions,从而分布在多台机器上。
    kex0916
        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 了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   989 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:58 · PVG 05:58 · LAX 14:58 · JFK 17:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.