При использовании только 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
, чтобы возвращать номер строки в качестве ключа вместо байтового смещения. Также не следует разбивать файлы для генерации последовательных чисел, и это нарушит параллелизм. Возможно, это можно сделать, используя пользовательские счетчики для синхронизации генерации чисел между сопоставителями. Во всяком случае, сделать это полностью распределенным способом - задача не из легких. Поэтому я предлагаю предварительно обработать файлы и добавить номера строк перед загрузкой в таблицу.