2015-08-21 11 views
5

में मौजूदा डेटाफ्रेम में नया कॉलम जोड़ना संभव है, मैं DataFrame API का उपयोग करता हूं।स्पार्क एसक्यूएल

मेरे पास मौजूदा डेटाफ्रेम और एक सूची वस्तु है (ऐरे का भी उपयोग कर सकते हैं)। इस सूची को मौजूदा डेटाफ्रेम में नए कॉलम के रूप में जोड़ना संभव है? क्या मुझे इसके लिए कक्षा Column का उपयोग करना चाहिए?

उत्तर

1

क्षमा करें, यह मेरी गलती थी, मैं पहले से ही समारोह withColumn(String colName, Column col) जो मेरी समस्या

+0

कॉलम के साथ एकमात्र समस्या यह है कि आपकी सूची से तत्वों को क्रमशः चुनना मुश्किल हो और उन्हें चयनित पंक्तियों में जोड़ें। यदि आपके पास ऐसा करने का कोई तरीका है, तो यह संभवतः बेहतर है, लेकिन आपका प्रश्न सामान्य कहने के लिए है;) – Niemand

+0

क्यों, मैं अपनी सूची को कॉलम ऑब्जेक्ट में सबसे पहले परिवर्तित कर दूंगा और इसे दूसरे फ़ंक्शन तर्क की तरह जोड़ दूंगा। क्या यह ठीक नहीं है? ... – Guforu

+0

दिलचस्प। कृपया समाप्त करने के बाद कृपया यह पोस्ट करें कि आपने इसे कैसे किया। – Niemand

5

आप शायद एक भी कॉलम RDD करने के लिए अपने सूची बदलने और आप द्वारा critetia pickeg पर शामिल होने के आवेदन करना चाहिए का समाधान करना चाहिए पाया। सरल DataFrame रूपांतरण:

val df1 = sparkContext.makeRDD(yourList).toDF("newColumn") 

आप में शामिल होने पर आप अधिक स्तंभ जोड़ने के लिए अपनी सूची मानचित्रण कर सकते हैं प्रदर्शन करने के लिए अतिरिक्त स्तंभ बनाने के लिए की जरूरत है:

val df1 = sparkContext.makeRDD(yourList).map(i => (i, fun(i)).toDF("newColumn", "joinOnThisColumn") 

मैं जावा संस्करण से परिचित नहीं हूँ, लेकिन आपको चाहिए JavaSparkContext.parallelize(yourList) का उपयोग करने का प्रयास करें और this doc पर आधारित समान मैपिंग ऑपरेशन लागू करें।

+0

ठीक है, धन्यवाद, मैं आपके समाधान का प्रयास करूंगा। हालांकि मुझे एपीआई जावा में कुछ फ़ंक्शन भी मिला है, स्कैला नहीं। आपका बहुत बहुत धन्यवाद। – Guforu

1

यह धागा थोड़ा पुराना है, लेकिन मैं जावा का उपयोग कर एक समान स्थिति में भाग गया। मुझे लगता है कि किसी भी चीज़ से ज्यादा, इस समस्या से मुझे कैसे संपर्क करना चाहिए इसकी एक वैचारिक गलतफहमी थी।

मेरी समस्या को ठीक करने के लिए, मैंने डेटासेट के लिए नए कॉलम में सहायता के लिए एक साधारण POJO बनाया (जैसा कि मौजूदा पर निर्माण करने का प्रयास करने के विपरीत)। मुझे अवधारणात्मक रूप से लगता है, मुझे समझ में नहीं आया कि प्रारंभिक पढ़ने के दौरान डेटासेट उत्पन्न करना सबसे अच्छा था जहां अतिरिक्त कॉलम को जोड़ा जाना आवश्यक था। मुझे उम्मीद है कि यह भविष्य में किसी की मदद करेगा।

निम्नलिखित पर विचार करें:

 JavaRDD<MyPojo> myRdd = dao.getSession().read().jdbc("jdbcurl","mytable",someObject.getProperties()).javaRDD().map(new Function<Row,MyPojo>() { 

         private static final long serialVersionUID = 1L; 

         @Override 
         public MyPojo call(Row row) throws Exception { 
         Integer curDos = calculateStuff(row); //manipulate my data 

         MyPojo pojoInst = new MyPojo(); 

         pojoInst.setBaseValue(row.getAs("BASE_VALUE_COLUMN")); 
         pojoInst.setKey(row.getAs("KEY_COLUMN")); 
         pojoInst.setCalculatedValue(curDos); 

         return dos; 
         } 
        }); 

     Dataset<Row> myRddRFF = dao.getSession().createDataFrame(myRdd, MyPojo.class); 

//continue load or other operation here... 
1

यहाँ एक उदाहरण है, जहां हम एक स्तंभ तारीख था और महीने के साथ एक और स्तंभ जोड़ना चाहते थे है।

Dataset<Row> newData = data.withColumn("month", month((unix_timestamp(col("date"), "MM/dd/yyyy")).cast("timestamp"))); 

इससे उम्मीद है कि यह मदद करता है!

चीयर्स!

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