Улей к улью ETL

У меня есть две большие таблицы Hive, скажем, TableA и TableB (которые загружаются из разных источников).

Эти две таблицы имеют почти идентичную структуру таблицы/столбцы с одним и тем же столбцом раздела, дата хранится в виде строки.

Мне нужно отфильтровать записи из каждой таблицы на основе определенных (идентичных) критериев фильтрации.

В этих таблицах есть несколько столбцов, содержащих «коды», которые необходимо просмотреть, чтобы получить соответствующие им «значения».

Существует восемь-десять таких таблиц поиска, скажем, LookupA, LookupB, LookupC и т. д.,

Теперь мне нужно:

  1. сделать объединение этих отфильтрованных записей из TableA и TableB.
  2. выполните поиск в таблицах поиска и замените эти «коды» из отфильтрованных записей их соответствующими «значениями». Если «код» или «значение» недоступны в отфильтрованных записях или таблице поиска соответственно, мне нужно заменить их нулем или пустой строкой.
  3. преобразовать даты в отфильтрованных записях из одного формата в другой

Я новичок в Hive. Пожалуйста, дайте знать, как я могу это сделать. Спасибо.

Примечание. Я могу справиться с объединением таблиц. Нужны некоторые рекомендации по поиску и преобразованию.


person Marco99    schedule 22.05.2016    source источник
comment
@shankarsh15 поделился подходом hive-UDF к поиску. Это включает в себя вклад дискового ввода-вывода со стороны разработчика. Как насчет того, чтобы использовать коррелированные подзапросы и позволить Hive обрабатывать то же самое? Любые комментарии приветствуются. Спасибо.   -  person Marco99    schedule 22.05.2016


Ответы (2)


Чтобы выполнить поиск, выполните следующие действия:

  1. Вы должны создать custom User Defined function(UDF), который в основном выполняет поиск, то есть вам нужно создать внутреннюю Java-программу для поиска, заархивировать ее и добавить в Hive, как показано ниже:

    ДОБАВИТЬ JAR /home/ubuntu/lookup.jar

  2. Затем вам нужно добавить файл поиска, содержащий пару ключ-значение, следующим образом:

    ДОБАВИТЬ ФАЙЛ /home/ubuntu/lookupA;

  3. Затем вам нужно создать временную функцию поиска, например

    СОЗДАТЬ ВРЕМЕННУЮ ФУНКЦИЮ getLookupValueA AS 'com.LookupA';

  4. Наконец, вы должны вызвать эту функцию поиска в запросе Select, который в основном заполнит значение поиска для данного ключа поиска.

    То же самое может быть достигнуто с помощью JOIN, но это скажется на производительности.

Используя подход соединения, вы можете очень хорошо присоединиться к коду поиска для исходных и поисковых таблиц, что-то вроде

select a.key,b.lookupvalue
table a join lookuptable b
where a.key=b.lookupKey

Теперь для Date Transformation вы можете использовать Date functions в Hive.

person shankarsh15    schedule 22.05.2016
comment
Конечно, этот ответ открыл новые возможности для размышлений. Мне просто любопытно узнать подход «присоединиться». Я ценю ответ. Спасибо за ваше время!! - person Marco99; 22.05.2016
comment
Ответ наверняка заслуживает положительного голосования. Я просто жду любых других/отличных точек зрения от сообщества. Примем последний звонок на подходе через день-два в обязательном порядке. Спасибо! - person Marco99; 22.05.2016

Для вышеуказанной проблемы выполните следующие действия:

  1. Используйте схему объединения для объединения двух таблиц (схема должна быть одинаковой).
  2. For the above scenario you can try pig script. script would look like(jn table A and tableB with lookup table and generate the appropriate columns):
    • a = join TableA by codesA left outer, lookupA by codesA.
    • b = присоединиться к a по кодам B слева от внешнего, искать B по кодам B.

Аналогично для таблицы Б.

Предположим, что некоторое значение codeA не имеет значения в таблице поиска, тогда:

z = foreach b generate codesA as codesA, valueA is null ? '0' as valuesA.

(заменит все нулевые значения из значения на 0).

  1. Если вы используете Pig 0.12 или более позднюю версию, вы можете использовать ToString(CurrentTime(),'yyyy-MM-dd')

Я надеюсь, что это решит вашу проблему. Дайте мне знать в случае каких-либо проблем.

person kishan singh    schedule 09.12.2016