2016-01-20 22 views
13

मैं अपने इनपुट डेटा लेने के लिए कोशिश कर रहा हूँ:स्पार्क: dataframe में कॉलम जोड़ें सशर्त

A B  C 
-------------- 
4 blah 2 
2   3 
56 foo  3 

और पर कि क्या बी खाली है या नहीं आधारित समाप्त करने के लिए एक कॉलम जोड़ें:

A B  C  D 
-------------------- 
4 blah 2  1 
2   3  0 
56 foo  3  1 

मैं एक इनपुट तालिका के रूप में इनपुट डेटाफ्रेम को पंजीकृत करके आसानी से ऐसा कर सकते हैं, फिर एक SQL क्वेरी टाइप कर सकते हैं।

लेकिन मैं वास्तव में यह जानना चाहता हूं कि स्कैला विधियों के साथ ऐसा कैसे करें और स्कैला के भीतर SQL क्वेरी टाइप न करें।

मैंने .withColumn की कोशिश की है, लेकिन मैं इसे जो भी करना चाहता हूं उसे प्राप्त नहीं कर सकता।

उत्तर

47

समारोह when साथ withColumn का प्रयास करें:

val sqlContext = new SQLContext(sc) 
import sqlContext.implicits._ // for `toDF` and $"" 
import org.apache.spark.sql.functions._ // for `when` 

val df = sc.parallelize(Seq((4, "blah", 2), (2, "", 3), (56, "foo", 3), (100, null, 5))) 
    .toDF("A", "B", "C") 

val newDf = df.withColumn("D", when($"B".isNull or $"B" === "", 0).otherwise(1)) 

newDf.show() से पता चलता

+---+----+---+---+ 
| A| B| C| D| 
+---+----+---+---+ 
| 4|blah| 2| 1| 
| 2| | 3| 0| 
| 56| foo| 3| 1| 
|100|null| 5| 0| 
+---+----+---+---+ 

मैं isNull मामले के परीक्षण के लिए (100, null, 5) सड़क जोड़ी गई।

मैंने Spark 1.6.0 के साथ इस कोड को आजमाया लेकिन when के कोड में टिप्पणी की, यह 1.4.0 के बाद संस्करणों पर काम करता है।

+0

प्रश्न को फिर से पढ़ना चाहेंगे यह वही है जो मैं ढूंढ रहा था। मैंने 'कब' और 'अन्यथा' के साथ दो अलग-अलग चीजों की कोशिश की लेकिन मुझे लगता है कि मुझे सही प्रारूप गलत हो रहा था। थोड़ा सा विषय बंद करें, लेकिन क्या आप जानते हैं कि स्पार्क कॉलम के साथ कैसे काम करता है? जैसे, अगर मैं ~ 20 कॉलम जोड़ रहा हूं, तो 20 करना होगा। साथ ही कॉलम और इसे डेटाफ्रेम रखें या इसे आरडीडी में मैप करें और बस उन्हें मानचित्र में जोड़ें और फिर लकड़ी की छत पर सहेजने के लिए डेटाफ्रेम में कनवर्ट करें ? – mcmcmc

+1

बस पाया [यह] (http://stackoverflow.com/questions/33826495/spark-scala-2-10-tuple-limit)। मुझे लगता है कि यूडीएफ जो मैं ढूंढ रहा हूं। – mcmcmc

+0

यूडीएफ मैं नीचे भी बात कर रहा था ... –

0

इस तरह कुछ कैसे?

val newDF = df.filter($"B" === "").take(1) match { 
    case Array() => df 
    case _ => df.withColumn("D", $"B" === "") 
} 

take(1) का उपयोग करते हुए एक न्यूनतम हिट

2

मेरे बुरा होना चाहिए, मैं सवाल का एक हिस्सा छोड़ दिया है।

UDF का उपयोग करने का सबसे अच्छा, साफ तरीका है। कोड के भीतर स्पष्टीकरण। इस प्रकार

// create some example data...BY DataFrame 
// note, third record has an empty string 
case class Stuff(a:String,b:Int) 
val d= sc.parallelize(Seq(("a",1),("b",2), 
    ("",3) ,("d",4)).map { x => Stuff(x._1,x._2) }).toDF 

// now the good stuff. 
import org.apache.spark.sql.functions.udf 
// function that returns 0 is string empty 
val func = udf((s:String) => if(s.isEmpty) 0 else 1) 
// create new dataframe with added column named "notempty" 
val r = d.select($"a", $"b", func($"a").as("notempty")) 

    scala> r.show 
+---+---+--------+ 
| a| b|notempty| 
+---+---+--------+ 
| a| 1| 1111| 
| b| 2| 1111| 
| | 3|  0| 
| d| 4| 1111| 
+---+---+--------+ 
+0

यहां खेलने पर केवल एक डेटाफ्रेम है। आप –

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