2016-11-09 3 views
0

У меня большая таблица фактов, примерно 500M строк в день. Таблица разделена на region_date.Оптимизация большого стола Присоединиться к PySpark

Я должен ежедневно сканировать через 6 месяцев данных, оставлять внешние соединения с другим меньшим подмножеством (строки 1M) на основе идентификатора столбца id & и вычислять два суммарных значения: sum (факт), если id существует в правой таблице & сумма (факт)

Мой SparkSQL выглядит следующим образом:

SELECT 
    a.region_date, 
    SUM(case 
      when t4.id is null then 0 
      else a.duration_secs 
     end) matching_duration_secs 
    SUM(a.duration_secs) total_duration_secs 
FROM fact_table a LEFT OUTER JOIN id_lookup t4 
     ON a.id = t4.id 
     and a.region_date = t4.region_date 
WHERE a.region_date >= CAST(date_format(DATE_ADD(CURRENT_DATE,-180), 'yyyyMMdd') AS BIGINT) 
    AND a.is_test = 0 
    AND a.desc = 'VIDEO' 
GROUP BY a.region_date 

Что является лучшим способом для оптимизации и распределения/разделения данных? Запрос выполняется более 3 часов. Я попробовал spark.sql.shuffle.partitions = 700

Если я скатываю ежедневные данные на уровне «id», это около 5 миллионов строк в день. Должен ли я сначала сверлить данные, а затем выполнить соединение?

Thanks,

Ram.

+0

Вы можете включить план выполнения? –

ответ

0

Поскольку в вашем запросе есть некоторые условия фильтрации, я думал, что вы можете разделить свой запрос на два запроса, чтобы сначала уменьшить объем данных.

 table1 = select * from fact_table 
     WHERE a.region_date >= CAST(date_format(DATE_ADD(CURRENT_DATE,-180), 'yyyyMMdd') AS BIGINT) 
     AND a.is_test = 0 
     AND a.desc = 'VIDEO' 

Затем вы можете использовать новую таблицу, которая намного меньше исходной таблицы присоединиться id_lookup таблицу

+0

Спасибо. Мой главный вопрос: есть ли способ оптимизировать производительность, используя раздел по региону_дайте внутри искры, или будет ли Spark делать это автоматически? – Ram

+0

Я не думаю, что spark.sql.shuffle.partitions увеличит производительность. Но поскольку вы выбрали данные по региону, это увеличит производительность, если вы разделите данные по региону_дайте. –

Смежные вопросы