Я пытаюсь увидеть разницу между выполнением лимитов в 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, чтобы проверить, не быстрее ли он
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 минуты, пока что это не так важно, но я думаю, что кажется, что или запрос к каталогу данных быстрее, или ограничение во фрейме данных лучше, чем ограничение в искровом SQL ?
В чем разница между сбором и глобальным и локальным лимитом? Я предполагаю, что локальный лимит означает, что он ограничивает локально, тогда драйвер сделает глобальный лимит, чтобы дать окончательный результат. Но почему Spark SQL также не выполняет эту оптимизацию?
Читает ли Spark все основные файлы паркета, прежде чем выполнять какие-либо ограничения? Есть ли способ указать спарку читать, пока он не получит всего 10 строк в этом примере?