2015-01-08 3 views
1

При выборе набора записей из таблицы данных большого объема данных для каждой записи необходимо создать уникальный ключ. В последовательном режиме работы легко создать уникальный идентификатор, вызывая soem, например max (id). Поскольку улей запускает задачу параллельно, как мы можем генерировать уникальный ключ как часть запроса выбора, не ставя под угрозу производительность hadoop. Действительно ли это проблема с уменьшением карты или нам нужно пойти на последовательный подход к ее решению.Уникальное генерирование ключей в Hive/Hadoop

ответ

3

Если по какой-то причине вы не хотите иметь дело с UUID, то это решение (основанное на числовых значениях) не требует, чтобы ваши параллельные блоки «разговаривали» друг с другом или синхронизировали вообще. Таким образом, он очень эффективен, но не гарантирует, что ваши целые ключи будут непрерывными.

Если у вас есть сказать, N параллельных блоков исполнения, и вы знаете, ваш N, и каждый блок присваивается идентификатор от 0 до N - 1, то вы можете просто создать уникальное целое во всех единицах

Unit #0: 0, N, 2N, 3N, ... 
Unit #1: 1, N+1, 2N+1, 3N+1, ... 
... 
Unit #N-1: N-1, N+(N-1), 2N+(N-1), 3N+(N-1), ... 

в зависимости от того, где вам необходимо сгенерировать ключи (картографа или редуктора) вы можете получить N от конфигурации Hadoop:

Mapper: mapred.map.tasks 
Reduce: mapred.reduce.tasks 

... и идентификатор вашего устройства: в Java, это:

context.getTaskAttemptID().getTaskID().getId() 

Не уверен в отношении улья, но это также должно быть возможно.

+0

Это лучший комментарий о Hadoop генерировать уникальный идентификатор, который я прочитал. – Tuxman

0
SELECT T.*, ROW_NUMBER() OVER (ORDER BY T.C1) AS SEQ_NBR 
FROM TABLE T 

Здесь С1 является любой числовой столбец в T. Это будет генерировать уникальный номер для каждой записи при выборе из таблицы T, начиная с 1. Если это один раз, а затем активность раствор хорошо.

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

SELECT T.*, ROW_NUMBER() OVER (ORDER BY T.C1)+ SEQ_T2 AS SEQ_NBR 
FROM TABLE T, (SELECT MAX(SEQ) AS SEQ_T2 FROM TABLE T2) 

Надеюсь, это поможет!

0

Используйте UUID вместо цифр. Он работает по-настоящему распределенным способом.

select reflect("java.util.UUID", "randomUUID") 
Смежные вопросы