使用 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)将文本转换为元组,但我不知道这是否是最好的方法,如果这甚至是我首先要做的事情。谢谢!
答案 0 :(得分:1)
总的来说,你需要做的是复制JOINED_IDS
这是一个包,然后FLATTEN
。在FLATTEN
之后,您可以通过ID
与查找表进行联接。然后在JOINED_IDS
和TYPE
上进行分组。这可以这样做:
注意:只有将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,[],[])