2016-08-31 15 views
12

में 1 कॉलम को 1 कॉलम में विभाजित करें मेरे पास स्काला का उपयोग करके स्पार्क में डेटाफ्रेम है जिसमें एक कॉलम है जिसे मुझे विभाजित करने की आवश्यकता है।स्पार्क स्कैला

scala> test.show 
+-------------+ 
|columnToSplit| 
+-------------+ 
|  a.b.c| 
|  d.e.f| 
+-------------+ 

मैं यह कॉलम होना ज़रूरी बाहर विभाजित इस तरह देखने के लिए:

+--------------+ 
|col1|col2|col3| 
| a| b| c| 
| d| e| f| 
+--------------+ 

मैं स्पार्क उपयोग कर रहा हूँ 2.0.0

धन्यवाद

उत्तर

22

प्रयास करें:

df.withColumn("_tmp", split($"columnToSplit", "\\.")).select(
    $"_tmp".getItem(0).as("col1"), 
    $"_tmp".getItem(1).as("col2"), 
    $"_tmp".getItem(2).as("col3") 
).drop("_tmp") 
+0

महान काम करता है, धन्यवाद! –

+0

विभाजन के लिए क्या आयात आवश्यक है? – Jake

+1

@ जेक आयात org.apache.spark.sql.functions.split इसका उपयोग करें –

7

एक समाधान जो सील से बचाता है सीटी भाग। जब तुम सिर्फ नए कॉलम संलग्न करना चाहते हैं तो यह उपयोगी है:

case class Message(others: String, text: String) 

val r1 = Message("foo1", "a.b.c") 
val r2 = Message("foo2", "d.e.f") 

val records = Seq(r1, r2) 
val df = spark.createDataFrame(records) 

df.withColumn("col1", split(col("text"), "\\.").getItem(0)) 
    .withColumn("col2", split(col("text"), "\\.").getItem(1)) 
    .withColumn("col3", split(col("text"), "\\.").getItem(2)) 
    .show(false) 

+------+-----+----+----+----+ 
|others|text |col1|col2|col3| 
+------+-----+----+----+----+ 
|foo1 |a.b.c|a |b |c | 
|foo2 |d.e.f|d |e |f | 
+------+-----+----+----+----+ 
2

प्रोग्राम के रूप में ऐसा करने के लिए, आप (0 until 3).map(i => col("temp").getItem(i).as(s"col$i")) साथ अभिव्यक्ति के एक दृश्य बना सकते हैं (आप परिणाम के रूप में 3 कॉलम की जरूरत मान) और फिर साथ select पर लागू : _* वाक्य रचना:

df.withColumn("temp", split(col("columnToSplit"), "\\.")).select(
    (0 until 3).map(i => col("temp").getItem(i).as(s"col$i")): _* 
).show 
+----+----+----+ 
|col0|col1|col2| 
+----+----+----+ 
| a| b| c| 
| d| e| f| 
+----+----+----+ 

सभी स्तंभों रखने के लिए:

df.withColumn("temp", split(col("columnToSplit"), "\\.")).select(
    col("*") +: (0 until 3).map(i => col("temp").getItem(i).as(s"col$i")): _* 
).show 
+-------------+---------+----+----+----+ 
|columnToSplit|  temp|col0|col1|col2| 
+-------------+---------+----+----+----+ 
|  a.b.c|[a, b, c]| a| b| c| 
|  d.e.f|[d, e, f]| d| e| f| 
+-------------+---------+----+----+----+ 
संबंधित मुद्दे