給定一個帶有元組的 RDD
(key1, 0)
(key2, 5)
(key3, 11)
(key1, 44)
(key2, 0)
(key3, 43)
(key1, 0)
(key2, 5)
(key3, 33)
對于每個key,我希望計算 2 個值,每個鍵的值的總計數,或 的常規輸出countByKey(),第二個計數,按鍵的正數計數。
所以結果會是這樣的:
[(key1, 3, 1),
(key2, 3, 2),
(key3, 3, 3)]
我只想使用map和reduceByKey功能:
def map(value):
return (value[0], (value[1], 1, 1))
回傳一個鍵值對,其中 value 是數值的三倍,兩個整數用于計數
def reduce(val1, val2):
# if value[0] is positive, increment first counter
# in any case, always increment second counter
data.map(map).reduceByKey(reduce).collect()
然后會是這樣的:
[(key1, 3, 1),
(key2, 3, 2),
(key3, 3, 3)]
uj5u.com熱心網友回復:
您可以在步驟中檢查 value 是否為正map并分配1if > 0else 0。然后,像這樣按鍵和求和:
rdd1 = data.map(lambda x: (x[0], (1, int(x[1] > 0)))) \
.reduceByKey(lambda a, b: (a[0] b[0], a[1] b[1]))
for k in rdd1.collect():
print(k)
#('key1', (3, 1))
#('key2', (3, 2))
#('key3', (3, 3))
uj5u.com熱心網友回復:
如果我理解正確的話是這樣的:
def reduce(val1, val2):
if val2[0] > 0: # val1 is the accumulator, val2 the new datum
return (val1[0], val1[1] 1, val1[2] 1)
else:
return (val1[0], val1[1] 1, val1[2])
data.map(map).reduceByKey(reduce).collect()
會作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/410847.html
標籤:
上一篇:Pyspark中的正則運算式
