spark sql: как оптимизировать объединение нескольких огромных таблиц улья - PullRequest
0 голосов
/ 22 января 2019

Есть работа spark sql:

spark.sql(s"""SELECT *
  FROM (
  select * from default.table1
  where
  created_dt between date '2018-01-01' and '2018-01-02'
  group by 1,2) table11, -- about 100,000,000 records
  default.table2 table22,-- about 600,000,000 records
  default.table3 table33,-- about 3000,000,000 records
  default.table4 table44-- about 100,000,000 records
  WHERE table22.item_id = table11.item_id
  AND hot.item_site_id  IN (SELECT SITE_ID FROM default.table5)
  AND table22.item_id = table33.item_id
  AND table22.end_dt = table33.end_dt
  AND table22.end_dt >= date '2018-01-01' - interval '180' day
  LIMIT 10000""")
  .collect()
  //.map(t => "Id: " + t(0))
  .foreach(println)

В работе таблица 4 Hive должна быть объединена в item_id и end_dt и других полях. в каждой таблице около 100 000 000 записей.

Как оптимизировать объединение? например Если каждая таблица разделена, производительность может быть значительно улучшена? Спасибо

1 Ответ

0 голосов
/ 23 января 2019

Существует несколько стратегий оптимизации соединений Spark.Многие из них описаны в этой презентации Spark Summit .Вы можете найти более подробную информацию об оптимизации SortMergeJoin производительности здесь .

Обратите внимание, что объединения слиянием сортировки могут очень эффективно работать с уже отсортированными данными.Один из способов получить данные в правильной форме - сохранить их в виде таблицы с сортировкой данных в каждом сегменте (df.write.bucketBy(n, "x").sortBy("x")).Таблица metastore сохранит информацию о сегментации, которая может быть использована оптимизатором запросов позже.Обратите внимание, что это НЕ будет работать, если вы сохраните путь, если вы не используете что-то вроде Databricks Delta.

Помимо этого, вы хотите посмотреть на мой ответ на , что является оптимизированным способом объединения большихтаблицы в Spark SQL .

...