我试图查看在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行?
答案 0 :(得分:1)
LogicalPlan
节点作为CollectLimit
,只有CollectLimitExec
个物理计划节点。并且limit
被实现为LocalLimit
,后跟GlobalLimit
(link to code)limit
。spark.sql.limit.scaleUpFactor
确定,默认为4),然后查询16,依此类推,直到满足限制或数据用尽。