评估Pig字符串字段以分组数字数组?

时间:2013-09-03 20:48:41

标签: apache-pig user-defined-functions

使用 Pig 0.8.1 以及我可用的数据结构/格式,是否有一种可行的方法(使用UDF或优选本机)将Pig / Hadoop中的字段转换为分组元组?如果可以拆分/评估数据,我有一个可以映射到的外部ID列表,并用更多描述性文本替换。

示例:

| TYPE      | JOINED IDS | ...
| some text | []         | ...
| more text | [123]      | ...
| even more | [123,456]  | ...

如果我能够使用field2并[以某种方式]将其分解,我认为我应该可以对查找表使用JOIN。如果我的查找表结构如此。 。

| ID  | DESCRIPTION |
| 123 | foo         |
| 456 | bar         |

我想将我的价值观归结为:

| TYPE      | JOINED IDS | JOINED TEXT | ...
| some text | []         | []          | ...
| more text | [123]      | [foo]       | ...
| even more | [123,456]  | [foo,bar]   | ...

我简要地研究了TOKENIZE,并且使用了一些正则表达式替换(即使用现有的UDF)将文本转换为元组,但我不知道这是否是最好的方法,如果这甚至是我首先要做的事情。谢谢!

1 个答案:

答案 0 :(得分:1)

总的来说,你需要做的是复制JOINED_IDS这是一个包,然后FLATTEN。在FLATTEN之后,您可以通过ID与查找表进行联接。然后在JOINED_IDSTYPE上进行分组。这可以这样做:

注意:只有将JOINED_IDS转换为行李才能使用UDF。

<强> myudf.py

#!/usr/bin/python

@outputSchema('tokens:{(token:chararray)}')
def tokenize_string(s):
    split_s = s.strip('[]').split(',')
    return split_s

<强> myscript.pig

REGISTER myudf.py USING jython AS myudf ;

-- A has the schema (TYPE: chararray, JOINED_IDS: chararray)
B = FOREACH A GENERATE *, FLATTEN(myudf.tokenize_string(JOINED_IDS)) ;

-- look_up has the schema (ID: chararray, DESCRIPTION: chararray)
C = JOIN B BY token LEFT, look_up BY ID ;

D = GROUP C BY (TYPE, JOINED_IDS) ;

E = FOREACH D GENERATE FLATTEN(group), C.DESCRIPTION AS JOINED TEXT ;

E的架构和输出:

E: {group::B::TYPE: chararray,group::B::JOINED_IDS: chararray,JOINED TEXT: {(look_up::DESCRIPTION: chararray)}}
(even_more,[123,456],{(foo),(bar)})
(more_text,[123],{(foo)})
(some_text,[],{()})

如果您需要JOINED_TEXT格式与JOINED_IDS相同,则可以使用此UDF:

@outputSchema('JOINED_TEXT: chararray')
def stringify(BAG):
    if BAG[0][0] is None:
        return '[]'
    return '[%s]' % ','.join(BAG) 

使用stringify时的架构和输出:

E: {group::B::TYPE: chararray,group::B::JOINED_IDS: chararray,JOINED_TEXT: chararray}
(even_more,[123,456],[foo,bar])
(more_text,[123],[foo])
(some_text,[],[])