我嘗試使用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文檔檢查,但無法找到任何方法
我嘗試使用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文檔檢查,但無法找到任何方法
您可以通過在RDD扭轉元組做到這一點,
RDD.map(lambda s: reversed(s))
[(1, a), (2, a),....]
將成爲
[(a, 1), (a, 2),....]
現在groupByKey()。
雖然我不知道效率,但它的工作:)
你可以使用這個腳本,
它將按價值。
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)
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
但是不像sum,合計價值需要洗牌。這是更好的,因爲你不交換元組:) – WoodChopper
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()
我想遍歷列表並使用某些聚合函數不是分佈式的方式,這可能最終導致spark的錯誤結果。 – WoodChopper
由於RDD不可迭代,它甚至不能工作。在旁註中,您可以簡單地使用:'for v,k in vals:lst.setdefault(k,[])。append(v)' – zero323
不是Spark分佈式編程思想。 – ybdesire