我們有一個配置單元倉庫,並且希望使用火花來完成各種任務(主要是分類)。有時將結果寫回配置單元表。例如,我們編寫了下面的python函數來查找由original_table第一列分組的original_table第二列的總和。該函數可以工作,但我們擔心效率低下,特別是要轉換爲鍵值對的映射和字典版本。函數combiner,mergeValue,mergeCombiner在別處定義,但工作正常。從聚合後的火花表中讀取和寫入
from pyspark import HiveContext
rdd = HiveContext(sc).sql('from original_table select *')
#convert to key-value pairs
key_value_rdd = rdd.map(lambda x: (x[0], int(x[1])))
#create rdd where rows are (key, (sum, count)
combined = key_value_rdd.combineByKey(combiner, mergeValue, mergeCombiner)
# creates rdd with dictionary values in order to create schemardd
dict_rdd = combined.map(lambda x: {'k1': x[0], 'v1': x[1][0], 'v2': x[1][1]})
# infer the schema
schema_rdd = HiveContext(sc).inferSchema(dict_rdd)
# save
schema_rdd.saveAsTable('new_table_name')
是否有更有效的方法來做同樣的事情?
不知道爲什麼你必須轉換爲rdd,但是如果你堅持你可以只做'key_value_rdd.reduceByKey(lambda x,y:sum(x,y))'而不是'combineByKey'。 – mtoto 2017-02-28 11:09:38