2015-07-14 3 views
5

मैं प्रारूप के आंकड़ों पर pyspark की reduceByKey फ़ंक्शन को कॉल करने का प्रयास कर रहा हूँ (([a,b,c], 1), ([a,b,c], 1), ([a,d,b,e], 1), ...PySpark के reduceByKey के लिए एक प्रमुख के रूप में एक सूची

ऐसा लगता है pyspark सामान्य कुंजी में महत्वपूर्ण हैं, बस से मूल्य में कमी के रूप एक सरणी को स्वीकार नहीं करेगा आवेदन करना .reduceByKey (जोड़ें)।

मैंने पहले से ही स्ट्रिंग में सरणी को .map((x,y): (str(x),y)) द्वारा परिवर्तित करने की कोशिश की है, लेकिन यह काम नहीं करता है क्योंकि तारों की परतों को सरणी में वापस प्रोसेस करना बहुत धीमा है।

क्या कोई तरीका है कि मैं एक कुंजी के रूप में सरणी का उपयोग सरणी का उपयोग कर सकता हूं या स्ट्रिंग को वापस सरणी में बदलने के लिए किसी अन्य फ़ंक्शन का उपयोग कर सकता हूं?

यहाँ जुड़े त्रुटि कोड

File "/home/jan/Documents/spark-1.4.0/python/lib/pyspark.zip/pyspark/shuffle.py", line 268, in mergeValues 
    d[k] = comb(d[k], v) if k in d else creator(v) 
TypeError: unhashable type: 'list' 
    enter code here 

सारांश है:

इनपुट: x =[([a,b,c], 1), ([a,b,c], 1), ([a,d,b,e], 1), ...]

वांछित आउटपुट: y =[([a,b,c], 2), ([a,d,b,e], 1),...] ऐसी है कि मैं y[0][1]

द्वारा y[0][0][0] और 2 द्वारा a यहां पहुंच सकता है,210

उत्तर

8

इस प्रयास करें:

rdd.map(lambda (k, v): (tuple(k), v)).groupByKey() 

का मतलब है के बाद से अजगर सूचियों परिवर्तनशील हैं यह है कि टुकड़ों में बांटा नहीं जा सकता है (__hash__ विधि प्रदान नहीं करते): दूसरी ओर से

>>> a_list = [1, 2, 3] 
>>> a_list.__hash__ is None 
True 
>>> hash(a_list) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'list' 

tuples अपरिवर्तनीय हैं और __hash__ प्रदान विधि कार्यान्वयन:

>>> a_tuple = (1, 2, 3) 
>>> a_tuple.__hash__ is None 
False 
>>> hash(a_tuple) 
2528502973977326415 

इसलिए एक कुंजी के रूप में उपयोग किया जा सकता है। इसी तरह आप frozenset का उपयोग करना चाहिए आप एक कुंजी के रूप में अनन्य मानों उपयोग करना चाहते हैं:

rdd.map(lambda (k, v): (frozenset(k), v)).groupByKey().collect() 
बजाय

set

# This will fail with TypeError: unhashable type: 'set' 
rdd.map(lambda (k, v): (set(k), v)).groupByKey().collect() 
+0

धन्यवाद कि वास्तव में सामान्य –

+0

में स्पार्क की मेरी समझ के साथ वास्तव में बहुत मदद करता है आपका स्वागत है। बीटीडब्ल्यू यह विशेष रूप से स्पार्क विशिष्ट नहीं है। जब आप सादा पायथन 'dicts' या 'sets' का उपयोग करते हैं तो वही बात लागू होती है। – zero323

संबंधित मुद्दे