[英]How to optimize this code on spark?
如何在Spark中使此代碼更高效?
我需要根據數據計算最小,最大,計數,均值。
這是我的示例數據,
名店錢
一家商店001 99.99
一家商店001 87.15
B店001 3.99
...
現在,我嘗試組織數據以按Name + Shop(鍵)生成平均值,最小值,最大值。
然后通過collect()獲得結果。
這是我的代碼,
def tupleDivide(y):
return float(y[0])/y[1]
def smin(a, b):
return min(a, b)
def smax(a, b):
return max(a, b)
raw = sgRDD.map(lambda x: getVar(parserLine(x),list_C+list_N)).cache()
cnt = raw.map(lambda (x,y,z): (x+"_"+y, 1)).countByKey()
sum = raw.map(lambda (x,y,z): (x+"_"+y, z)).reduceByKey(add)
min = raw.map(lambda (x,y,z): (x+"_"+y, z)).reduceByKey(smin)
max = raw.map(lambda (x,y,z): (x+"_"+y, z)).reduceByKey(smax)
raw_cntRDD = sc.parallelize(cnt.items(),3)
raw_mean = sum.join(raw_cntRDD).map(lambda (x, y): (x, tupleDivide(y)))
有人會提供有關優雅編碼風格的建議嗎?
謝謝!
您應該使用aggregateByKey
進行更優化的處理。 想法是存儲state
向量,該state
向量由count,min,max和sum組成,並使用聚合函數獲取最終值。 另外,您可以使用元組作為鍵,也不必將鍵連接到單個字符串中。
data = [
['x', 'shop1', 1],
['x', 'shop1', 2],
['x', 'shop2', 3],
['x', 'shop2', 4],
['x', 'shop3', 5],
['y', 'shop4', 6],
['y', 'shop4', 7],
['y', 'shop4', 8]
]
def add(state, x):
state[0] += 1
state[1] = min(state[1], x)
state[2] = max(state[2], x)
state[3] += x
return state
def merge(state1, state2):
state1[0] += state2[0]
state1[1] = min(state1[1], state2[1])
state1[2] = max(state1[2], state2[2])
state1[3] += state2[3]
return state1
res = sc.parallelize(data).map(lambda x: ((x[0], x[1]), x[2])).aggregateByKey([0, 10000, 0, 0], add, merge)
for x in res.collect():
print 'Client "%s" shop "%s" : count %d min %f max %f avg %f' % (
x[0][0], x[0][1],
x[1][0], x[1][1], x[1][2], float(x[1][3])/float(x[1][0])
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.