Как добавить номера строк файлов в таблицы Hive - PullRequest
0 голосов
/ 03 мая 2018

Есть ли способ загрузить несколько файлов в таблицу Hive с номером строки файлов? Я могу нормально загрузить каждую запись в файл, и я знаю, что вы можете использовать input__file__name, чтобы получить имя файла, из которого получен код, так есть ли аналогично способ извлечь, из какой строки файла этот код?

С учетом этих трех произвольных файлов:

a.txt           b.txt          c.txt
a1              b1             a3
b2              b2             b3
c3              c3             c4

есть ли способ загрузить их в таблицу Hive с номерами строк файла, из которого он получен? Примечание: к фактическим файлам не добавляется номер. В результате я хочу такой результат:

SELECT * FROM result;

даст:

Line_Number             code
1                       a1
1                       b1
1                       c1
2                       a2
2                       b2
2                       c2
3                       a3
3                       b3
3                       c3

1 Ответ

0 голосов
/ 03 мая 2018

При использовании только HiveQL это невозможно, поскольку файлы разделяемы и читаются многими картографами. И расколы не линии. Файлы разбиваются на байты, а не на границы строк. И расколы обрабатываются независимо от картографов. Картографы ничего не знают друг о друге. Простой способ - это предварительно обработать ваши файлы и добавить номер строки, используя shell / etc, а затем загрузить их в таблицы с определенным столбцом line_number. Например, используя awk:

 awk '{printf "%s\t%s\n",NR,$0}' a.txt > a1.txt

Это добавит столбец с номером строки, разделенный табуляцией. a.txt - это входной файл, a1.txt - файл результатов

И если вы хотите использовать Map-Reduction для этой цели, вам нужно реализовать свой собственный TextInputFormat / LineRecordReader, чтобы возвращать номер строки в качестве ключа вместо байтового смещения. Также не следует разбивать файлы для генерации последовательных чисел, и это нарушит параллелизм. Возможно, это можно сделать, используя пользовательские счетчики для синхронизации генерации чисел между сопоставителями. Во всяком случае, сделать это полностью распределенным способом - задача не из легких. Поэтому я предлагаю предварительно обработать файлы и добавить номера строк перед загрузкой в ​​таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...