Skip to main content
 首页 » 编程设计

python之在 Python 中为 Pig 编写 UDF

2025年05月04日15sharpest

我已经为这个问题苦苦挣扎了几个小时。希望有人能帮助我。输入为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: unsupported operand type(s) for +: 'int' and 'unicode'

请您参考如下方法:

这是一个猜测。讯息:

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

引用片段:

  map(sum,zip(*,input))  

这意味着您正在尝试将总和作为一个 unicode 元组,例如[u'1', u'2'] 而不是整数元组,例如[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))