PySpark में कई डेटा फ़्रेम रो-वार मर्ज करना


21

मैं 10 डेटा फ्रेम है pyspark.sql.dataframe.DataFrame, से प्राप्त randomSplitके रूप में (td1, td2, td3, td4, td5, td6, td7, td8, td9, td10) = td.randomSplit([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1], seed = 100)अब मैं 9 में शामिल करना चाहते td'एक भी डेटा फ्रेम में है, मुझे लगता है कि कैसे करना चाहिए?

मैंने पहले ही प्रयास कर लिया है unionAll, लेकिन यह फ़ंक्शन केवल दो तर्कों को स्वीकार करता है।

td1_2 = td1.unionAll(td2) 
# this is working fine

td1_2_3 = td1.unionAll(td2, td3) 
# error TypeError: unionAll() takes exactly 2 arguments (3 given)

वहाँ दो से अधिक डेटा फ्रेम पंक्ति-वार गठबंधन करने का कोई तरीका है?

ऐसा करने का उद्देश्य यह है कि मैं PySpark CrossValidatorविधि का उपयोग किए बिना मैन्युअल रूप से 10-गुना क्रॉस सत्यापन कर रहा हूं , इसलिए प्रशिक्षण में 9 और परीक्षण डेटा में 1 ले रहा हूं और फिर मैं इसे अन्य संयोजनों के लिए दोहराऊंगा।


1
यह सीधे प्रश्न का उत्तर नहीं देता है, लेकिन यहां मैं नामकरण विधि में सुधार करने का सुझाव देता हूं ताकि अंत में, हमें टाइप न करना पड़े, उदाहरण के लिए: [td1, td2, td3, td4, td5, td6, td7 , td8, td9, td10]। 100 गुना सीवी के लिए ऐसा करने की कल्पना करें। यहाँ मैं क्या करूँगा: भाग = [0.1] * 10 cv = df7.randomSplit (भाग) सिलवटों = सूची (श्रेणी (10)) के लिए मैं रेंज में (10): test_data = cv [i] fold_no_i = सिलवटों: i] + folds [i + 1:] train_data = cv [fold_no_i [0]] में j के लिए fold_no_i [1:]: train_data = train_data.union (cv [j])
ngoc thoag

जवाबों:


37

से चोरी: /programming/33743978/spark-union-of-multan-ds

चाइनिंग यूनियनों के बाहर यह डेटाफ्रेम के लिए एकमात्र तरीका है।

from functools import reduce  # For Python 3.x
from pyspark.sql import DataFrame

def unionAll(*dfs):
    return reduce(DataFrame.unionAll, dfs)

unionAll(td2, td3, td4, td5, td6, td7, td8, td9, td10)

क्या होता है कि यह उन सभी वस्तुओं को ले जाता है जिन्हें आप मापदंडों के रूप में पारित करते हैं और यूनियनएल का उपयोग करके उन्हें कम करते हैं (यह कमी पायथन से है, न कि स्पार्क कम हालांकि वे समान रूप से काम करते हैं) जो अंततः इसे एक डेटाफ़्रेम में कम कर देता है।

यदि DataFrames के बजाय वे सामान्य RDD हैं तो आप उन्हें अपने SparkContext के संघ कार्य में शामिल कर सकते हैं।

संपादित करें: आपके उद्देश्य के लिए, मैं एक अलग विधि का प्रस्ताव करता हूं, क्योंकि आपको क्रॉसवॉलिडेशन के लिए अपने अलग-अलग सिलवटों के लिए इस पूरे संघ को 10 बार दोहराना होगा, मैं उन लेबलों को जोड़ूंगा जिनके लिए एक पंक्ति से संबंधित है और बस अपने डेटाफ़्रेम को आपके हर आधार पर फ़िल्टर करें पर्ची


(+1) एक अच्छा काम। हालांकि, एक फ़ंक्शन होने की आवश्यकता है जो कई डेटाफ्रेम के संयोजन की अनुमति देता है। काफी आसान होगा!
Dawny33

मैं इससे सहमत नहीं हूँ
Jan van der Vegt

@JanvanderVegt धन्यवाद, यह काम करता है और प्रशिक्षण और परीक्षण डेटासेट को फ़िल्टर करने के लिए लेबल जोड़ने का विचार है, मैंने यह पहले ही कर लिया था। आपकी मदद के लिए बहुत बहुत शुक्रिया।
कृष्ण प्रसाद

@Jan van der Vegt क्या आप इस तर्क से जुड़ने के लिए एक ही तर्क को लागू कर सकते हैं और इस सवाल का जवाब दे सकते हैं
जॉर्जऑफTheRF


6

कुछ समय के लिए, जब संयोजित करने के लिए डेटाफ्रेम में कॉलम का समान क्रम नहीं होता है, तो यह सुनिश्चित करना बेहतर होता है कि यूनियन से पहले दोनों df का कॉलम क्रम एक जैसा हो।

import functools 

def unionAll(dfs):
    return functools.reduce(lambda df1,df2: df1.union(df2.select(df1.columns)), dfs) 

उदाहरण:

df1 = spark.createDataFrame([[1,1],[2,2]],['a','b'])
# different column order. 
df2 = spark.createDataFrame([[3,333],[4,444]],['b','a']) 
df3 = spark.createDataFrame([555,5],[666,6]],['b','a']) 

unioned_df = unionAll([df1, df2, df3])
unioned_df.show() 

यहाँ छवि विवरण दर्ज करें

इसके बजाय नीचे परिणाम उत्पन्न होगा।

from functools import reduce  # For Python 3.x
from pyspark.sql import DataFrame

def unionAll(*dfs):
    return reduce(DataFrame.unionAll, dfs) 

unionAll(*[df1, df2, df3]).show()

यहाँ छवि विवरण दर्ज करें


2

पुनरावर्तन का उपयोग कैसे करें?

def union_all(dfs):
    if len(dfs) > 1:
        return dfs[0].unionAll(union_all(dfs[1:]))
    else:
        return dfs[0]

td = union_all([td1, td2, td3, td4, td5, td6, td7, td8, td9, td10])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.