用 Python 为 Pig 编写 UDF

Posted

技术标签:

【中文标题】用 Python 为 Pig 编写 UDF【英文标题】:Writing UDF in Python for Pig 【发布时间】:2015-05-31 08:42:35 【问题描述】:

我已经在这个问题上苦苦挣扎了几个小时。希望任何人都可以帮助我。输入为bag结构,如([1,2]),([3,4]),目标是输出bag中对应元组元素之和,如(4,6)。非常感谢。

我的代码:

@outputSchema('aa:chararray')
def func(input):
    aa = map(sum,zip(*,input)) 
    aa = str(aa)
    return aa

TypeError:+ 的不支持的操作数类型:“int”和“unicode”

【问题讨论】:

【参考方案1】:

这是一个猜测。消息:

 TypeError: unsupported operand type(s) for +: 'int' and 'unicode'

指的是片段:

  map(sum,zip(*,input)) 

这意味着您正在尝试将总和作为一个 unicode 元组,例如[u'1', u'2'] 而不是 int 的元组,例如[1,2] 你认为你正在使用。

如果是这种情况,那么您可以将 zip 包裹在 list comprehension 中以进行从 unicode 到 int 的转换:

 [map(int, a) for a in zip(*,input)]

但是您可能还潜伏着另一个错误。从@outputSchema('aa:chararray') 判断,您想要返回一个字符串列表,而不是单个字符串; str([1,2])"[1,2]",我想你想要 ["1", "2"]。如果是这种情况(您可能不应该检查),您也可以将其包装在列表理解中:

aa = [str(s) for s in aa]

结合这两个变化,你的代码变成:

@outputSchema('aa:chararray')
def func(input):
    aa = map(sum,[map(int, a) for a in zip(*,input)])
    aa = [map(str, a) for a in aa]
    return aa

如果您无法从这里解决问题,那么了解更多信息会很有帮助。例如,该类型错误是否指向代码中的特定行?如果有,是哪条线?

也许您可以显示input* 的类型。例如,将您的功能更改为:

 ...
 def func(input):
   aa = map(sum,zip(*,input)) 
 ...

到:

 def func(input):
   print(map(type, input))
   print(map(type, *))
   aa = map(sum,zip(*,input))

【讨论】:

以上是关于用 Python 为 Pig 编写 UDF的主要内容,如果未能解决你的问题,请参考以下文章

对于 Apache Pig,如何在 python 中编写 Load UDF

多个元组作为用 Java 编写的 pig UDF 中的输入

如何从 Pig 中的 Python UDF 打印?

我如何编写 UDF 以将第二列转换为大写

在 Talend 中实现 UDF 和 Pig 脚本逻辑

PIG UDF (Python) 字符集编码