создание уникальных идентификаторов в hive

Я пытался создать уникальные идентификаторы для каждой строки таблицы (30 миллионов+ строк).

  • использование последовательных номеров, очевидно, не работает из-за параллельного характера Hadoop.
  • встроенные UDFs rand () и hash(rand (), unixtime ()), похоже, генерируют коллизии.

должен быть простой способ генерировать идентификаторы строк, и мне было интересно, у кого есть решение.

  • мой следующий шаг - просто создание Java map reduce задание для генерации реальной хэш-строки с безопасным случайным + хост IP + текущее время в качестве семени. но я думаю, что я бы спросил здесь, прежде чем делать это;)

7 ответов


используйте отражение UDF для создания UUID.

reflect("java.util.UUID", "randomUUID")

Не уверен, что это все, что полезно, но здесь идет...

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