2015-03-19 19 views
7

पर ऑपरेशन मैं स्पार्क 1.3 से डेटाफ्रेम एपीआई का उपयोग करता हूं।डेटा फ्रेम

मैं डेटाफ्रेम के सभी तत्वों को खोए बिना डेटाफ्रेम में किसी तारीख से सप्ताह का दिन प्राप्त करना चाहता हूं।

मैं डेटाफ्रेम एपीआई का उपयोग करने से पहले इसे सरल मानचित्र पर प्राप्त करने के लिए जोडाटाइम का उपयोग करता था।

अभी एक समाधान है कि काम करता है:

sqlContext.createDataFrame(myDataFrame.map(l=>operationOnTheField(l)),myDataFrame.schema)) 

यह एक RDD[Row] पर एक नक्शे के लिए वापस जा के बिना आपरेशन करने के लिए और फिर इस RDD के साथ एक DataFrame बनाने संभव है?

उत्तर

1

इस

Table.select(Table("Otherkey"),MyUdf(Table("ColNeeded")).as("UdfTransformed")) 

MyUdf एक यूडीएफ आप द्वारा परिभाषित किया गया है की कोशिश करो।

10

आप DataFrame पर select() पर कॉल करने के संयोजन का उपयोग कर सकते हैं और प्रश्न में कॉलम को बदलने के लिए उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन (यूडीएफ) का उपयोग कर सकते हैं।

import org.apache.spark.sql.SQLContext 
import org.apache.spark.{SparkContext, SparkConf} 
import org.apache.spark.sql.functions._ 

मामला वर्ग उदाहरण DataFrame स्थापित करने के लिए।

private case class Cust(id: Integer, name: String, 
     sales: Double, discount: Double, state: String) 

फिर एक SQLContext की स्थापना की और इस प्रकार DataFrame बनाएँ:

import sqlContext.implicits._ 

val custs = Seq(
    Cust(1, "Widget Co", 120000.00, 0.00, "AZ"), 
    Cust(2, "Acme Widgets", 410500.00, 500.00, "CA"), 
    Cust(3, "Widgetry", 410500.00, 200.00, "CA"), 
    Cust(4, "Widgets R Us", 410500.00, 0.0, "CA"), 
    Cust(5, "Ye Olde Widgete", 500.00, 0.0, "MA") 
) 
val customerDF = sc.parallelize(custs, 4).toDF() 

एक सरल यूडीएफ है कि आप "छूट" स्तंभ को बदलने के लिए इस्तेमाल करेंगे रजिस्टर।

val myFunc = udf {(x: Double) => x + 1} 

कॉलम प्राप्त करें, "छूट" कॉलम पर यूडीएफ लागू करने और दूसरों को छोड़कर उन्हें छोड़ दें।

val colNames = customerDF.columns 
val cols = colNames.map(cName => customerDF.col(cName)) 
val theColumn = customerDF("discount") 

मैं कॉलम से मेल खाने के लिए "बेहतर" तरीका ढूंढना चाहता हूं लेकिन निम्नलिखित कार्य करता हूं। कॉलम को नया नाम देने के लिए as() का उपयोग करें क्योंकि हम कर सकते हैं!

val mappedCols = cols.map(c => 
    if (c.toString() == theColumn.toString()) myFunc(c).as("transformed") else c) 

उपयोग() के उत्पादन के लिए चयन नई DataFrame

val newDF = customerDF.select(mappedCols:_*) 

आप

id name   sales discount state 
1 Widget Co  120000.0 0.0  AZ 
2 Acme Widgets 410500.0 500.0 CA 
3 Widgetry  410500.0 200.0 CA 
4 Widgets R Us 410500.0 0.0  CA 
5 Ye Olde Widgete 500.0 0.0  MA 

बदल दिया है

id name   sales transformed state 
1 Widget Co  120000.0 1.0   AZ 
2 Acme Widgets 410500.0 501.0  CA 
3 Widgetry  410500.0 201.0  CA 
4 Widgets R Us 410500.0 1.0   CA 
5 Ye Olde Widgete 500.0 1.0   MA 

में पूर्ण उदाहरण मिल सकते हैं source code here । यदि आप सटीक कॉलम प्रतिस्थापन के बारे में चिंतित नहीं हैं तो आप इसे सरल बना सकते हैं।

+2

उदाहरण के लिए धन्यवाद। मेरे दृष्टिकोण से यूडीएफ स्पार्क डेटा फ्रेम एपीआई में बहुत ही सुरुचिपूर्ण और सहज नहीं है = ( –