2015-10-01 127 views
1

我嘗試使用groupByKey()方法類似組由火花蟒蛇值

[(1, a), (2, a), (3, a), (4, a), (3, b), (1, b), (1, c), (4, c), (4, d)] 

我能夠通過組從原始密鑰值對值分組通過關鍵,但我不能用價值發現的方式來組

a = [1 , 2 , 3 , 4] 
b = [3, 1] 
c = [1, 4] 
d = [4] 

我在火花API文檔檢查,但無法找到任何方法

回答

1

您可以通過在RDD扭轉元組做到這一點,

RDD.map(lambda s: reversed(s)) 

[(1, a), (2, a),....] 

將成爲

[(a, 1), (a, 2),....] 

現在groupByKey()。

雖然我不知道效率,但它的工作:)

-2

你可以使用這個腳本,

它將按價值。

vals = [(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a'), (3, 'b'), (1, 'b'), (1, 'c'), (4, 'c'), (4, 'd')] 

lst = {} 
for k,v in vals: 
    if v in lst.keys(): 
     lst[v] = lst[v] + [k] 
    else: 
     lst[v] = [k] 
print(lst) 
+0

我想遍歷列表並使用某些聚合函數不是分佈式的方式,這可能最終導致spark的錯誤結果。 – WoodChopper

+0

由於RDD不可迭代,它甚至不能工作。在旁註中,您可以簡單地使用:'for v,k in vals:lst.setdefault(k,[])。append(v)' – zero323

+0

不是Spark分佈式編程思想。 – ybdesire

2

Spark的RDD有一個groupBy運算符,您可以在其中傳遞自定義groupBy函數。

data = sc.parallelize([(1, a), (2, a), (3, a), (4, a), (3, b), (1, b), (1, c), (4, c), (4, d)]) 
data.groupBy(lambda tup: tup[1]) 

這將按值(元組的第二個元素)對數據進行分組。請注意,groupBy和groupByKey可能會導致內存不足異常,並且是昂貴的操作。請參閱Avoid GroupByKey

+0

但是不像sum,合計價值需要洗牌。這是更好的,因爲你不交換元組:) – WoodChopper

0
input = sc.parallelize([(1,"a"),(2,"a"),(3,"a"),(4,"a"),(1,"b"),(3,"b"),(1,"c"),(4,"c"),(4,"d")]) 
input.groupByKey().collect() 
output1 = input.map(lambda (x,y):(y,x)) 
output2 = output1.groupByKey() 
output2.collect()