0

使用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)将文本转换为元组,但我不知道这是否是最好的方法,如果这甚至是我想要的首先做。谢谢!

4

1 回答 1

1

总的来说,你需要做的就是复制JOINED_IDS一个包,然后FLATTEN它。编辑后,FLATTEN您可以通过ID. 然后在JOINED_IDS和上分组TYPE。这可以像这样完成:

注意: UDF 只需要转换JOINED_IDS成袋子。

myudf.py

#!/usr/bin/python

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

我的脚本.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,[],{()})

如果您需要使用与此 UDFJOINED_TEXT相同的格式:JOINED_IDS

@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,[],[])
于 2013-09-03T22:16:14.847 回答