2016-11-04 11 views
6

मैं एक dataframe df उस प्रकार सरणी में से एक स्तंभस्पार्क 2.0.x एक dataframe प्रकार स्ट्रिंग

df.show() लग रहा है

तरह
|ID|ArrayOfString|Age|Gender| 
+--+-------------+---+------+ 
|1 | [A,B,D]  |22 | F | 
|2 | [A,Y]  |42 | M | 
|3 | [X]   |60 | F | 
+--+-------------+---+------+ 

मैं डंप करने की कोशिश शामिल है में से एक सरणी युक्त से एक csv फ़ाइल डंप कि df पालन एक csv फ़ाइल में:

val dumpCSV = df.write.csv(path="/home/me/saveDF") 

यह स्तंभ ArrayOfString की वजह से काम नहीं कर रहा।

CSV data source does not support array string data type

कोड काम करता है अगर मैं स्तंभ ArrayOfString को दूर: मैं त्रुटि मिलती है। लेकिन मुझे ArrayOfString रखने की जरूरत है!

सबसे अच्छा तरीका क्या स्तंभ ArrayOfString सहित सीएसवी dataframe डंप करने के लिए होगा (ArrayOfString CSV फ़ाइल पर एक स्तंभ के रूप में फेंक दिया जाना चाहिए)

उत्तर

8

प्रयास करें:

val stringify = udf((vs: Seq[String]) => s"""[${vs.mkString(",")}]""") 

df.withColumn("ArrayOfString", stringify($"ArrayOfString")).write.csv(...) 
+0

नमस्ते उत्तर के लिए बहुत बहुत धन्यवाद। मैं समझता हूं कि ये रेखाएं क्या करती हैं। हालांकि मैं वाक्यविन्यास के कुछ उलझन में हूं "[$ {vs.mkString (", ")}]" "" क्या आप मुझे एस और ट्रिपल के बारे में कुछ और बता सकते हैं? "धन्यवाद। – S12000

+0

http : //docs.scala-lang.org/overviews/core/string-interpolation.html '" "" क्योंकि 'एम्बेडेड है' '' –

+0

हम आपको उस दस्तावेज़ के धन्यवाद के बारे में बेहतर समझते हैं जो आप मुझे भेजते हैं हालांकि मुझे अभी भी समझ नहीं आ रहा है कि क्यों 3 उद्धरण। मैं क्यों नहीं लिख सकता "[$ {vs.mkString (", ")}]" 1 उद्धरण का उपयोग करके मेरी तरफ भी काम करता है। तो क्यों 3 उद्धरण? – S12000

0

Pyspark कार्यान्वयन:

इस उदाहरण में, सहेजने से पहले क्षेत्र column_as_array से column_as_string बदलें।

from pyspark.sql.functions import udf 
from pyspark.sql.types import StringType 

def array_to_string(my_list): 
    return '[' + ','.join([str(elem) for elem in my_list]) + ']' 

array_to_string_udf = udf(array_to_string,StringType()) 

df = df.withColumn('column_as_str',array_to_string_udf(d["column_as_array"])) 

फिर आप सहेजने से पहले पुराने कॉलम (सरणी प्रकार) को छोड़ सकते हैं।

df.drop("column_as_array").write.csv(...) 
0

सीएसवी आदर्श निर्यात स्वरूप नहीं है, लेकिन अगर आप सिर्फ नेत्रहीन अपने डेटा का निरीक्षण करना चाहते हैं, यह काम करेंगे [स्काला]। त्वरित और गंदे समाधान।

case class example (id: String, ArrayOfString: String, Age: String, Gender: String) 

df.rdd.map{line => example(line(0).toString, line(1).toString, line(2).toString , line(3).toString) }.toDF.write.csv("/tmp/example.csv") 
संबंधित मुद्दे