Take 2: вместо нескольких JOINs, как насчет создавая огромную «разреженную» таблицу, затем запускающую массивную GROUP BY?
- создать временную таблицу с все ожидали 101 COLS
- создать 50 внешних таблиц, отображенные на ваших 50 исходных файлов (в 50 различных каталогов) с 3 колонками каждый, конечно
- выполнения 50 INSERT - ВЫБРАТЬ запросы для загрузки каждого файла в таблицу temp, в соответствующих столбцах, т.е.
insert into table SPARSE select ID, CODE1, VAL1, null, null, null, ... from SOURCE1 ;
insert into table SPARSE select ID, null, null, CODE2, VAL2, null, ... from SOURCE2 ;
- запустить окончательный GROUP BY выравниваться результат: для данного ID существует только одно ненулевое значение для code1, так что Макс (code1) будет в действительности означает, "получить значение, которое пришло из source1 и игнорировать NULLS из других источников"
select ID, Max(CODE1), Max(VAL1), Max(CODE2), ... from SPARSE group by ID
Я не уверен на 100%, что он может превзойти ваши текущие 24 часа обработки; но, возможно, стоит попробовать. Надеемся, что одно массовое задание MapReduce будет более эффективным, чем несколько заданий для распределенных JOIN.
~~~~
Кстати, массивное GROUP BY, возможно, потребует тщательной настройки, то есть проверка, что число картопостроителей & Переходники имеют смысл (если нет, то попробуйте запустить статистику по временной таблицы и/или жесткие настройки некоторых свойств), гарантируя, что промежуточные результаты будут сжаты с помощью Snappy или LZ4 (чтобы уменьшить площадь ввода-вывода с разумными нагрузками на процессор) и т. д. Обычные вещи.
Одна крупная оптимизация может включать в себя ведра на временной таблице; но вы не можете запускать несколько INSERT против таблицы в bucketized, поэтому вам придется попробовать массивный INSERT OVERWRITE - SELECT UNION ALL SELECT UNION ALL ... yuck.
ваш вопрос не очень ясен ... не могли бы вы правильно указать пример – Amar
@Mahesh: Есть ли лучший способ сделать это? – Learner