2015-05-31 2 views
2

Я боролся с этой проблемой в течение нескольких часов. Надеюсь, кто-нибудь может мне помочь. Вход представляет собой структуру мешка, такую ​​как {([1,2]),([3,4])}, и целью является вывод суммы соответствующего элемента кортежей в сумке, скажем (4,6). Большое спасибо.Написание UDF в Python для свиньи

Мой код:

@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'

ответ

1

Вот догадка. Сообщение:

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

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

map(sum,zip(*,input)) 

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

Если это так, то вы можете обернуть молнию внутри list comprehension сделать преобразование из юникода в целом:

[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)) 
Смежные вопросы