用Python编写UDF for Pig

时间:2015-05-31 08:42:36

标签: python apache-pig udf

我已经在这个问题上挣扎了几个小时。希望有人能帮助我。输入是包结构,例如{([1,2]),([3,4])},目标是输出包中元组的相应元素的总和,比如说(4,6)。非常感谢。

我的代码:

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

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

1 个答案:

答案 0 :(得分: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))