【问题标题】:Evaluate a Pig string field to grouped numeric array?将 Pig 字符串字段评估为分组数值数组?
【发布时间】:2013-09-03 20:48:41
【问题描述】:

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

【问题讨论】:

  • 您能否提供DESCRIBE 的输出,用于您想要进行 JOIN 的两个输入?答案会因架构而异。
  • 数据类型?假设所有字段都是 CHARARRAY。 ID 可能是 INT。
  • JOINED IDS 字段下的我的值是文字“[123,456]

标签: apache-pig user-defined-functions


【解决方案1】:

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

注意:UDF 仅用于将JOINED_IDS 转换为包。

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_TEXTJOINED_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,[],[])

【讨论】:

  • 太棒了!我今天会处理这个问题,所以如果我有任何问题,我会再发表评论。
  • 我的@outputSchema('tokens:{(token:chararray)}') 行似乎确实存在问题,但是在下载并引用了 Jython 之后,到目前为止,其余的运行良好。 Error parsing schema for script function from the decorator org.apache.pig.impl.logicalLayer.parser.ParseException: Encountered " "{" "{ "" at line 1, column 8. Was expecting one of: "int" ... "long" ... "float" ... "double" ... "chararray" ... "bytearray" ... "int" ... "long" ... "float" ... "double" ... "chararray" ... "bytearray" ...
  • 等等,在你让 Jython 工作之后,它是否一直给你这个错误?
  • 这是在我能够让 Jython 工作之后。我知道它正在工作,因为否则它将无法运行脚本,更不用说返回错误了。我确实遇到过这个,如果有什么安慰的话:Unresolved Pig Improvement
  • 我的备份计划如果失败,我可以随时将字段发送到 UDF 并让它完成所有工作。我可以通过 MySQL 或我发送到的输出文件获取我的查找表(为这一步做准备)。不是一个完美的解决方案,但如果有必要我可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 2016-04-01
  • 2022-01-25
  • 1970-01-01
  • 2012-02-22
相关资源
最近更新 更多