Apache spark 理解Spark解释:收集vs全局vs局部限制

Apache spark 理解Spark解释:收集vs全局vs局部限制,apache-spark,pyspark,aws-glue,Apache Spark,Pyspark,Aws Glue,我正在尝试了解Spark/AWS胶水中执行限制的区别 我试着使用sparksql spark.sql("SELECT * FROM flights LIMIT 10") 解释看起来像: CollectLimit 10 +- *FileScan parquet xxxxxx.flights[Id#31,...] Batched: true, Format: Parquet, Location: CatalogFileIndex[s3://xxxxxx/flights], PartitionCou

我正在尝试了解Spark/AWS胶水中执行限制的区别

我试着使用sparksql

spark.sql("SELECT * FROM flights LIMIT 10")
解释看起来像:

CollectLimit 10
+- *FileScan parquet xxxxxx.flights[Id#31,...] Batched: true, Format: Parquet, Location: CatalogFileIndex[s3://xxxxxx/flights], PartitionCount: 14509, PartitionFilters: [], PushedFilters: [], ReadSchema: struct<...
解释如下:

GlobalLimit 10
+- LocalLimit 10
+- LogicalRDD [Id#70, ...]
第一次运行时间为5分钟,第二次运行时间为4分钟,还没有那么重要,但我认为查询数据目录的速度更快,或者在数据帧中执行限制比在spark SQL中执行限制更好

收取限额与全球限额与本地限额有什么区别?我猜局部限制意味着它在局部限制,然后驱动程序将执行全局限制以给出最终结果。但是为什么Spark SQL不也进行这种优化呢

Spark是否在执行任何限制之前读取所有底层拼花地板文件?在本例中,有没有一种方法可以让spark一直读到只得到10行

  • SQL方式,编程数据集创建-两种情况下的控制流相同,它通过Spark SQL catalyst。在您的情况下,当第一次运行查询时,它从元存储中获取关于表的元数据并缓存它,在后续查询中,它被重用,这可能是第一次查询速度缓慢的原因
  • 没有
    LogicalPlan
    节点作为
    CollectLimit
    ,只有
    CollectLimitExec
    physicalplan节点。而
    limit
    实现为
    LocalLimit
    ,后跟
    GlobalLimit
    ()
  • Spark以增量方式执行
    limit

    它尝试使用一个分区检索给定数量的行。 如果行数不满足要求,Spark然后查询接下来的4个分区(由
    Spark.sql.limit.scaleUpFactor决定,默认值为4),然后查询16个分区,依此类推,直到满足限制或数据耗尽为止
    
  • SQL方式,编程数据集创建-两种情况下的控制流相同,它通过Spark SQL catalyst。在您的情况下,当第一次运行查询时,它从元存储中获取关于表的元数据并缓存它,在后续查询中,它被重用,这可能是第一次查询速度缓慢的原因
  • 没有
    LogicalPlan
    节点作为
    CollectLimit
    ,只有
    CollectLimitExec
    physicalplan节点。而
    limit
    实现为
    LocalLimit
    ,后跟
    GlobalLimit
    ()
  • Spark以增量方式执行
    limit

    它尝试使用一个分区检索给定数量的行。 如果行数不满足要求,Spark然后查询接下来的4个分区(由
    Spark.sql.limit.scaleUpFactor决定,默认值为4),然后查询16个分区,依此类推,直到满足限制或数据耗尽为止
    
    GlobalLimit 10
    +- LocalLimit 10
    +- LogicalRDD [Id#70, ...]