2016-11-04 23 views
6

Tôi có một dataframe df có chứa một cột kiểu mảng2.0.x Spark đổ một tập tin csv từ một dataframe chứa một mảng kiểu string

df.show() trông giống như

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

tôi cố gắng để đổ rằng df trong một tập tin csv như sau:

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

Nó không phải là làm việc vì của cột ArrayOfString. Tôi gặp lỗi:

CSV data source does not support array string data type

Mã hoạt động nếu tôi xóa cột ArrayOfString. Nhưng tôi cần giữ ArrayOfString!

Điều gì sẽ là cách tốt nhất để đổ dataframe csv bao gồm cột ArrayOfString (ArrayOfString nên được đổ như một cột vào file CSV)

Trả lời

8

Hãy thử:

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

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

Xin cảm ơn rất nhiều vì câu trả lời. Tôi hiểu những gì những dòng này. Tuy nhiên tôi là một chút nhầm lẫn của cú pháp s "" "[$ {vs.mkString (", ")}]" "" Bạn có thể giải thích cho tôi thêm một chút về s và ba "" "? Cảm ơn. – S12000

+0

http : //docs.scala-lang.org/overviews/core/string-interpolation.html '" "" 'bởi vì có nhúng' "' –

+0

Hum Tôi hiểu rõ hơn ý nghĩa của "s" nhờ tài liệu bạn gửi cho tôi Tuy nhiên tôi vẫn không hiểu tại sao 3 dấu ngoặc kép. Tại sao tôi không thể viết s "[$ {vs.mkString (", ")}]" Bằng cách sử dụng 1 trích dẫn cũng hoạt động bên cạnh tôi. Vậy tại sao 3 dấu ngoặc kép? – S12000

0

Pyspark thực hiện:

Trong ví dụ này, thay đổi trường column_as_array thành column_as_string trước khi lưu.

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"])) 

Sau đó, bạn có thể thả cột cũ (loại mảng) trước khi lưu.

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

CSV không phải là định dạng xuất lý tưởng, nhưng nếu bạn chỉ muốn kiểm tra trực quan dữ liệu, điều này sẽ hoạt động [Scala]. Giải pháp nhanh và bẩn.

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") 
Các vấn đề liên quan