Как вы можете сделать Apache Pig FLATTEN на основе типа данных? - PullRequest
0 голосов
/ 27 сентября 2018

У меня большой набор данных с полями id и details.details - это либо карта, либо мешок карт.Моя конечная цель - запись id, key, value для каждой записи во всех картах данных.

В 0.16 я мог бы свободно использовать FLATTEN, чтобы убедиться, что у меня только одна карта на строку, а затем использоватьUDF, чтобы сгладить карты.Но поскольку 0.17, FLATTEN работает и на картах.Это приводит к ситуации, когда после одного использования у меня есть некоторые данные точно так, как я хочу, но остальные данные все еще находятся на карте.

По сути, мне нужно один раз использовать FLATTENдля половины данных и дважды для другой половины.Есть ли способ определить тип данных в операторе GENERATE, чтобы сгладить данные только в том случае, если это карта?

В качестве иллюстрации приведено

(ID1, [key1#val1,key2#val2])
(ID2, {[key3#val3, key4#val4]})

Я хочу создать

(ID1, key1, val1)
(ID1, key2, val2)
(ID2, key3, val3)
(ID2, key4, val4)

1 Ответ

0 голосов
/ 30 сентября 2018

Вам в основном нужен UDF, который скажет вам, является ли вход для него действительной картой или нет.С таким UDF вы можете установить троичную операцию на FLATTEN, только если конкретное поле является действительной картой.Akela от Mozilla имеет среди прочего именно тот UDF, который вы ищете.Вы можете найти репозиторий с открытым исходным кодом Akela в https://github.com/mozilla-metrics/akela, а интересующий UDF в https://github.com/mozilla-metrics/akela/blob/master/src/main/java/com/mozilla/pig/filter/map/IsMap.java

Использование будет выглядеть примерно так:

IMPORT <path_to_jar>/akela.jar
DEFINE IsMap com.mozilla.pig.filter.map.IsMap();

data = LOAD '<path_to_data>';

dataFlattened = FOREAH data GENERATE
        $0,
        IsMap($1) ? FLATTEN($1) : $1;
...