создание уникальных идентификаторов в hive
Я пытался создать уникальные идентификаторы для каждой строки таблицы (30 миллионов+ строк).
- использование последовательных номеров, очевидно, не работает из-за параллельного характера Hadoop.
- встроенные UDFs rand () и hash(rand (), unixtime ()), похоже, генерируют коллизии.
должен быть простой способ генерировать идентификаторы строк, и мне было интересно, у кого есть решение.
- мой следующий шаг - просто создание Java map reduce задание для генерации реальной хэш-строки с безопасным случайным + хост IP + текущее время в качестве семени. но я думаю, что я бы спросил здесь, прежде чем делать это;)
7 ответов
Не уверен, что это все, что полезно, но здесь идет...
рассмотрим собственный аналог MapReduce: предполагая, что ваш набор входных данных основан на тексте, ключ входного картографа (и, следовательно, уникальный идентификатор) будет для каждой строки именем файла плюс его байтовое смещение.
при загрузке данных в Hive, если вы можете создать дополнительный "столбец", который имеет эту информацию, вы получите свой rowID бесплатно. Это семантически бессмысленно, но также и подход, который вы упоминаете выше.
разработка ответа jtravaglini, существует 2 встроенных виртуальных столбца Hive начиная с 0.8.0, которые можно использовать для создания уникального идентификатора:
INPUT__NAME, BLOCK_смещение _ ВНУТРИ _ _ ФАЙЛА
используйте так:
выберите
функция concat(INPUT__NAME,':', BLOCK_смещениевнутри файла___), а вы можете анономизировать это с md5 или подобным, вот ссылка на md5 UDF:
https://gist.github.com/dataminelab/1050002
(обратите внимание, что имя класса функций initcap 'Md5')
выберите Алгоритм MD5(функция concat(INPUT__NAME,':', BLOCK_смещение_внутри _ _ файла)) как rowkey, ...
reflect ("java.утиль.UUID", "randomUUID")
Я не мог проголосовать за другого. Мне нужна была чистая двоичная версия, поэтому я использовал это:
unhex (regexp_replace (reflect ('java.утиль.UUID', 'randomUUID'), '-', "))
в зависимости от характера ваших заданий и того, как часто вы планируете их выполнять, использование последовательных номеров может быть разумной альтернативой. Вы можете реализовать rank()
UDF, как описано в это другой так вопрос.
напишите пользовательский Сопоставитель, который сохраняет счетчик для каждой задачи карты и создает в качестве идентификатора строки для строки конкатенацию JobID() (как получено из Mr API) + текущее значение счетчика. Перед рассмотрением следующей строки увеличьте счетчик.
Если вы хотите работать с несколькими картографами и с большим набором данных, попробуйте использовать этот UDF:https://github.com/manojkumarvohra/hive-hilo
Он использует zookeeper в качестве центрального репозитория для поддержания состояния последовательности и генерируемых уникальных увеличивающихся числовых значений