2015-08-08 4 views
0

Я хотел бы знать эффективный способ объединить все поля/столбцы с Несколько файлов в один файл. Для каждогоОбъединить столбцы/поля из 50 больших файлов в один файл

File1:

1,fname1,one 
2,fname2,two 

Файл2:

1,lname1,lone 
2,lname2,ltwo 

Ожидаемый выходной

1,fname1, one,lname1,lone 
2,fname2,two,lname2,ltwo 

У меня есть около 70 файлов, как это более 100 млн записей и 6 столбцов в каждой.

В настоящее время я пытаюсь сделать это, используя соединение hive. Кажется, он работает вечно - почти 24 часа и все еще работает. Мне нужно лучшее решение.

+0

ваш вопрос не очень ясен ... не могли бы вы правильно указать пример – Amar

+0

@Mahesh: Есть ли лучший способ сделать это? – Learner

ответ

1

Объединение 70 файлов в «наивном» способе означает, что Улей должен выполнить 69 шагов в порядке, при этом левый набор данных становится все больше и больше. Если вы разложите задачу явно с вложенными подзапросами - то есть соедините A с B, C с D, затем с AB с CD и т. Д. - это будет менее катастрофично, но все же ресурсоемким.

И в любом случае Hive не будет использовать тот факт, что все файлы уже отсортированы (см. Документацию о соединениях Sort-Merge и явное требование о ведении)..

На самом деле, ваша проблема столь же стара, как и COBOL на мэйнфреймах. И я не уверен, что он может быть эффективно разрешен распределенным способом (для начала необходимо будет последовательно разделять файлы). Поэтому, пожалуйста, рассмотреть не-Hadoop решения:

  • Если вы хотите производительность и решение промышленного уровня - и есть много денег, чтобы тратить - то купить лицензию Syncsort или аналогичный инструмент
  • Если вы просто хотите получить работу прямо сейчас, скачать все файлы к коробке Linux и попробовать старый добрый sort -m команды (не уверен, о влиянии на RAM и своп, хотя)
+0

Спасибо за ответ. Да, я уже пробовал подход к разбиению на несколько объединений. Infact мой 24-часовой тайм-аут только после разрыва объединений в партии. Хороший старый сорт не будет работать здесь. Это настоящая проблема с большими данными и не может быть решена с помощью доброй старой сортировки. –

+0

@ Амар: Я привел пример тоже. Я не уверен, что вы ищете, когда говорите, что это непонятно. Не могли бы вы рассказать. –

0

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.

+0

Спасибо, кажется разумным. У меня было что-то еще в виду. Я еще не знаю, как это сделать, но вот что я имею в виду. Разделите данные по горизонтали. Я имею в виду, что у меня будут все столбцы, построенные для всего диапазона идентификаторов в одном файле. следующий диапазон будет в другом файле –

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