Возврат кортежа неизвестной длины из UDF python, а затем применение хэша в Pig

Это вопрос, который состоит из двух частей:

Во-первых, у меня есть пользовательская функция Python, которая создает список строк неизвестной длины. Вход в UDF - это map (dict в python), а количество ключей практически неизвестно (это то, что я пытаюсь получить).

Чего я не знаю, так это того, как вывести это в схеме, которая позволяет мне вернуть ее в виде списка (или какой-либо другой итерируемой структуры данных). Это то, что у меня есть до сих пор:

@outputSchema("?????") #WHAT SHOULD THE SCHEMA BE!?!?
def test_func(input):

    output = []
    for k, v in input.items():

        output.append(str(key))

    return output

Теперь вторая часть вопроса. В Pig я хочу применить хэш SHA к каждому элементу. в "списке" для всех моих пользователей. Какой-то псевдокод свиньи:

USERS = LOAD 'something' as (my_map:map[chararray])
UDF_OUT = FOREACH USERS GENERATE my_udfs.test_func(segment_map)
SHA_OUT = FOREACH UDF_OUT GENERATE SHA(UDF_OUT)

Последняя строка, вероятно, неверна, поскольку я хочу применить SHA к каждому элементу в списке, а НЕ ко всему списку.


person sedavidw    schedule 22.06.2015    source источник


Ответы (1)


Чтобы ответить на ваш вопрос, поскольку вы возвращаете список python, содержимое которого является строкой, вам нужно, чтобы ваш декоратор был

@outputSchema('name_of_bag:{(keys:chararray)}')

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

При этом есть гораздо более простой способ сделать то, что вам нужно. Существует функция KEYSET() (Вы можете сослаться на этот вопрос, на который я ответил), который извлечет ключи из Pig Map. Итак, используя набор данных из этого примера и добавив еще несколько ключей к первому, поскольку вы сказали, что содержимое вашей карты имеет переменную длину.

maps
----
[a#1,b#2,c#3,d#4,e#5]
[green#sam,eggs#I,ham#am]

Запрос:

REGISTER /path/to/jar/datafu-1.2.0.jar;
DEFINE datafu.pig.hash.SHA();

A = LOAD 'data' AS (M:[]);
B = FOREACH A GENERATE FLATTEN(KEYSET(M));
hashed = FOREACH B GENERATE $0, SHA($0);
DUMP hashed;

Вывод:

(d,18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4)
(e,3f79bb7b435b05321651daefd374cdc681dc06faa65e374e38337b88ca046dea)
(b,3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d)
(c,2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6)
(a,ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb)
(ham,eccfe263668d171bd19b7d491c3ef5c43559e6d3acf697ef37596181c6fdf4c)
(eggs,46da674b5b0987431bdb496e4982fadcd400abac99e7a977b43f216a98127721)
(green,ba4788b226aa8dc2e6dc74248bb9f618cfa8c959e0c26c147be48f6839a0b088)
person gobrewers14    schedule 24.06.2015