Apache pig 将清管器字符串字段计算为分组数字数组?

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] | ... 如果我能

使用Pig 0.8.1和我可用的数据结构/格式,是否有可行的方法(使用UDF或最好是本机)将Pig/Hadoop中的字段转换为分组元组?我有一个外来ID列表,如果我可以拆分/评估数据,我可以映射到这些ID并用更具描述性的文本替换它们

示例:

| 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抓取,也可以通过我发送给它的输出文件(为这一步做准备)。这不是一个完美的解决方案,但如果需要,我可以。