了解Spark解释:收集,全局,本地限制

时间:2019-05-25 02:52:05

标签: apache-spark pyspark aws-glue

我试图查看在Spark / AWS Glue中执行限制之间的区别

我尝试使用Spark SQL

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<...

然后我尝试使用AWS Glue数据目录查看它是否更快

gdf = glueContext.create_dynamic_frame.from_catalog(database = "xxxxxx", table_name = "xxxxxx")
df = gdf.toDF()
df = df.limit(10)

df.explain(True)

df.show(10)

说明如下:

GlobalLimit 10
+- LocalLimit 10
+- LogicalRDD [Id#70, ...]

第一次运行在5分钟内,第二次运行在4分钟内,虽然还不是很重要,但是我认为查询数据目录似乎更快,或者对数据帧进行限制要比对Spark SQL进行限制更好?

集合限制,全局限制和本地限制之间有什么区别?我猜本地限制意味着它确实在本地限制,然后驱动程序将执行全局限制以给出最终结果。但是,为什么Spark SQL也没有进行此优化?

Spark是否在执行任何限制之前先读取所有基础镶木地板文件?在这种情况下,是否有办法告诉Spark读取直到只有10行?

1 个答案:

答案 0 :(得分:1)

    SQL方式,程序化数据集创建-两种情况下的控制流程都是相同的,都是通过Spark SQL催化剂进行的。在您的情况下,首次运行查询时,它将从元存储中获取有关表的元数据并将其缓存,在随后的查询中将其重用,这可能是第一个查询运行缓慢的原因。
  1. 没有LogicalPlan节点作为CollectLimit,只有CollectLimitExec个物理计划节点。并且limit被实现为LocalLimit,后跟GlobalLimitlink to code
  2. Spark逐步执行limit
    它尝试使用一个分区检索给定的行数。 如果不满足行数,Spark然后查询下四个分区(由spark.sql.limit.scaleUpFactor确定,默认为4),然后查询16,依此类推,直到满足限制或数据用尽。