2016-09-01 74 views
1

考慮放射性散佈具有低於數據集 其中10000241是鍵,其餘的是值reduceByKey在火花用於添加元組

('10000241',([0,0,1],[None,None,'RX'])) 
('10000241',([0,2,0],[None,'RX','RX'])) 
('10000241',([3,0,0],['RX',None,None])) 


pv1 = rdd.reduceBykey(lambda x,y :(
        addtup(x[0],y[0]), 
        addtup(x[1],y[1]), 
       )) 


def addtup(t1,t2): 
    j =() 
    for k,v in enumerate(t1): 
     j = j + (t1[k] + t2[k],) 
    return j 

最終輸出我想是(10000241,(3,2,1)(」 RX','RX','RX)) 但我得到的錯誤無法添加無類型的無類型或nonetype Str .how我可以克服這個問題?

+2

我不是當然,爲什麼這是一個Spark問題,但在標準Python中給出了這三個元素,那麼如何將RX字符串與None結合起來呢?這是錯誤 –

+0

另外你想要做的事情讓我想起SQL中的COALESCE運算符,除了你有0和None而不是null –

回答

1

如果我正確地理解了你,你想總結第一個元組中的數字並在第二個元組中使用邏輯?

我想你應該重寫你的函數如下:

def addtup(t1,t2): 
    left = list(map(lambda x: sum(x), zip(t1[0], t2[0]))) 
    right = list(map(lambda x: x[0] or x[1], zip(t1[1], t2[1]))) 
    return (left, right) 

然後你可以使用它像這樣:

rdd.reduceBykey(addtup) 

這裏是一個示範

import functools 

data = (([0,0,1],[None,None,'RX']), 
([0,2,0],[None,'RX','RX']), 
([3,0,0],['RX',None,None])) 


functools.reduce(addtup, data) 
#=> ([3, 2, 1], ['RX', 'RX', 'RX']) 
+0

感謝您的解決方案,但我嘗試了不同的解決方案,因爲我想使用spark 。謝謝你的努力!。 – Abid

+0

@解決方案是爲火花:) – fl00r