Понимание Spark Объясните: сбор против глобального против локального ограничения - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь увидеть разницу между выполнением лимитов в 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 строк в этом примере?

1 Ответ

2 голосов
/ 25 мая 2019
  1. Способ SQL, создание набора программных данных - поток управления в обоих случаях одинаковый, он проходит через катализатор Spark SQL.В вашем случае, когда запрос был запущен в первый раз, он выбирает метаданные о таблице из метастаза и кэширует его, в последующих запросах он используется повторно, это может быть причиной медлительности первого запроса.
  2. Нет узла LogicalPlan как CollectLimit, есть только узел CollectLimitExec физического плана.И limit реализован как LocalLimit, за которым следует GlobalLimit ( ссылка на код )
  3. Spark выполняет limit с приращением.
    Он пытается получить указанное числостроки с использованием одного раздела.Если количество строк не удовлетворяется, Spark запрашивает следующие 4 раздела (определяется spark.sql.limit.scaleUpFactor, по умолчанию 4), затем 16 и т. Д. До тех пор, пока не будет достигнут предел или не будут исчерпаны данные.
...