2016-07-07 15 views
13

में एक dict से एक पंक्ति का निर्माण करना मैं pySpark 1.6.1 में गतिशील रूप से एक पंक्ति बनाने की कोशिश कर रहा हूं, फिर इसे डेटाफ्रेम में बनाएं। सामान्य विचार describe के परिणामों को विस्तारित करना है, उदाहरण के लिए, स्काई और कुर्टोसिस। यहाँ मैं क्या सोचा काम करना चाहिए है:pySpark

from pyspark.sql import Row 

row_dict = {'C0': -1.1990072635132698, 
      'C3': 0.12605772684660232, 
      'C4': 0.5760856026559944, 
      'C5': 0.1951877800894315, 
      'C6': 24.72378589441825, 
      'summary': 'kurtosis'} 

new_row = Row(row_dict) 

लेकिन यह रिटर्न TypeError: sequence item 0: expected string, dict found जो एक काफी स्पष्ट त्रुटि है। तब मैंने पाया कि अगर मैं पंक्ति में फ़ील्ड पहले परिभाषित, मैं एक dict इस्तेमाल कर सकते हैं:

r = Row('summary', 'C0', 'C3', 'C4', 'C5', 'C6') 
r(row_dict) 
> Row(summary={'summary': 'kurtosis', 'C3': 0.12605772684660232, 'C0': -1.1990072635132698, 'C6': 24.72378589441825, 'C5': 0.1951877800894315, 'C4': 0.5760856026559944}) 

कौन सा एक ठीक कदम हो सकता है, सिवाय इसके कि इसे तरह मैं गतिशील में फ़ील्ड को निर्दिष्ट कर सकते हैं नहीं लगता है। मुझे अज्ञात नामों के साथ अज्ञात संख्या में पंक्तियों के लिए काम करने की आवश्यकता है। प्रलेखन के अनुसार आप वास्तव में अन्य तरीके से जा सकते हैं:

>>> Row(name="Alice", age=11).asDict() == {'name': 'Alice', 'age': 11} 
True 

तो ऐसा लगता है कि मुझे ऐसा करने में सक्षम होना चाहिए। यह भी प्रतीत होता है कि पुरानी संस्करणों से कुछ बहिष्कृत विशेषताएं हो सकती हैं जो इसे अनुमति देती हैं, उदाहरण के लिए here। क्या कोई और वर्तमान बराबर है जो मुझे याद आ रहा है?

उत्तर

17

आप इस प्रकार खोल कीवर्ड तर्कों का उपयोग कर सकते हैं:

Row(**row_dict) 

## Row(C0=-1.1990072635132698, C3=0.12605772684660232, C4=0.5760856026559944, 
##  C5=0.1951877800894315, C6=24.72378589441825, summary='kurtosis') 

यह है कि यह internally sorts data by keyproblems with older Python versions संबोधित करने के लिए नोट करना महत्वपूर्ण है।

+0

क्या यह पायथन के विशिष्ट संस्करण से मान्य है या यह एक सामान्य नियम है? कारण मैं पूछ रहा हूं कि आपके [नवीनतम संपादन] (https://stackoverflow.com/posts/38253641/revisions) के कारण है। – eliasah

+1

@eliasah चूंकि स्पार्क हमेशा आंतरिक रूप से सॉर्ट करेगा, इससे कोई फर्क नहीं पड़ता कि हम इससे पहले क्या करते हैं। और जेआईआरए चर्चा को तब तक नहीं बदला जाएगा जब तक स्पार्क पाइथन <3.6 (जल्द ही कभी नहीं) के लिए समर्थन छोड़ देता है। 'ऑर्डर्ड डिक्ट' थोड़ा भ्रामक था, इसलिए मैंने इसे हटा दिया। – zero323

+0

ठीक है धन्यवाद! वह मेरे भ्रम की उत्पत्ति थी। – eliasah

1

यदि नियम फ़्लैट नहीं होता है, तो आप नियम को पंक्ति में दोबारा बदल सकते हैं।

def as_row(obj): 
    if isinstance(obj, dict): 
     dictionary = {k: as_row(v) for k, v in obj.items()} 
     return Row(**dictionary) 
    elif isinstance(obj, list): 
     return [as_row(v) for v in obj] 
    else: 
     return obj