Apache pig 将清管器字符串字段计算为分组数字数组?
使用Pig 0.8.1和我可用的数据结构/格式,是否有可行的方法(使用UDF或最好是本机)将Pig/Hadoop中的字段转换为分组元组?我有一个外来ID列表,如果我可以拆分/评估数据,我可以映射到这些ID并用更具描述性的文本替换它们 示例:Apache pig 将清管器字符串字段计算为分组数字数组?,apache-pig,user-defined-functions,Apache Pig,User Defined Functions,使用Pig 0.8.1和我可用的数据结构/格式,是否有可行的方法(使用UDF或最好是本机)将Pig/Hadoop中的字段转换为分组元组?我有一个外来ID列表,如果我可以拆分/评估数据,我可以映射到这些ID并用更具描述性的文本替换它们 示例: | TYPE | JOINED IDS | ... | some text | [] | ... | more text | [123] | ... | even more | [123,456] | ... 如果我能
| TYPE | JOINED IDS | ...
| some text | [] | ...
| more text | [123] | ...
| even more | [123,456] | ...
如果我能够获取field2并[以某种方式]打破它,我认为我应该能够对查找表使用联接。如果我的查找表是这样构造的
| ID | DESCRIPTION |
| 123 | foo |
| 456 | bar |
我想返回我的价值观,接近:
| TYPE | JOINED IDS | JOINED TEXT | ...
| some text | [] | [] | ...
| more text | [123] | [foo] | ...
| even more | [123,456] | [foo,bar] | ...
我简要地研究了
标记化
,并用一些正则表达式替换(即使用现有的UDF)将文本转换为元组,但我不知道这是否是最好的方法,也不知道这是否是我首先想要做的。谢谢 总的来说,你需要做的是复制一个包,然后将它展平。将其展平后,您可以通过ID
与查找表进行连接。然后在上分组加入ID
和类型
。可以这样做:
注意:UDF仅用于将连接的\u id
转换为行李
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_id
的格式相同,您可以使用此自定义项:
@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,[],[])
您是否可以为要进行连接的两个输入提供
descripe
的输出?答案会因模式的不同而有很大差异。数据类型是什么?假设所有字段都是字符。ID可能是INT。我在连接的ID
字段下的值是一个文本“[123456]
”太棒了!我今天将对此进行研究,因此如果有任何问题,我将发布另一条评论。我确实似乎对@outputSchema('tokens:{(token:chararray)}')
行有问题,但在下载并引用Jython之后,其余部分到目前为止运行良好<代码>从decorator org.apache.pig.impl.logicalayer.parser.ParseException解析脚本函数的架构时出错:在第1行第8列遇到“{”{”。应为“int”…“long”…“float”…“double”…“chararray”…“bytearray”…“int”…“long”…“float”…“double”…查莱…“拜蒂莱”…等等,在你让Jython工作之后,它是否一直给你这个错误?这是在我让Jython工作之后。我知道它工作是因为它无法运行脚本,更不用说返回错误了。我确实遇到了这个问题,如果有什么安慰的话:我的备份计划如果失败,我可以随时发送f我的查找表可以通过MySQL抓取,也可以通过我发送给它的输出文件(为这一步做准备)。这不是一个完美的解决方案,但如果需要,我可以。