Написание UDF на Python для Pig

Я боролся с этой проблемой в течение нескольких часов. Надеюсь, кто-нибудь может мне помочь. Ввод представляет собой структуру пакета, например {([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'


person Alex    schedule 31.05.2015    source источник


Ответы (1)


Вот предположение. Сообщение:

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

относится к фрагменту:

  map(sum,zip(*,input)) 

и это означает, что вы пытаетесь взять сумму в виде кортежа unicode, например. [u'1', u'2'], а не кортеж целых чисел, например. [1,2] как вы думаете, с чем вы работаете.

Если это так, то вы можете поместить zip в списковое понимание для преобразования из 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)) 
 ...

to:

 def func(input):
   print(map(type, input))
   print(map(type, *))
   aa = map(sum,zip(*,input))
person rocky    schedule 31.05.2015