2016-11-04 12 views
6

Mam dataframe df który zawiera jedną kolumnę typu tablicyzapłonowe 2.0.x zrzucić plik CSV z pomocą dataframe zawierającego jedną tablicę typu string

df.show() wygląda

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

próbuję zrzucić że df w pliku cSV następujące:

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

To nie działa, ponieważ kolumny ArrayOfString. Wystąpił błąd:

CSV data source does not support array string data type

Kod działa, jeśli usunę kolumnę ArrayOfString. Ale muszę zachować ArrayOfString!

Jaki byłby najlepszy sposób zrzucić dataframe csv tym kolumnowej ArrayOfString (ArrayOfString należy dumpingowych jako jednej kolumnie pliku CSV)

Odpowiedz

8

Spróbuj:

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

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

Witam, dziękuję za odpowiedź. Rozumiem, co robią te linie. Jednak jestem nieco zdezorientowany ze składni "" "[$ {vs.mkString (", ")}]" "" Czy możesz mi wyjaśnić nieco więcej o s i potrójnym "". "Dzięki . – S12000

+0

http : //docs.scala-lang.org/overviews/core/string-interpolation.html '" "" 'ponieważ jest osadzone' '' –

+0

Hum Rozumiem lepiej znaczenie "s" dzięki dokumentowi, który mi wysłałeś Jednak nadal nie rozumiem, dlaczego 3 cytaty Dlaczego nie mogę napisać s "[$ {vs.mkString (", ")}]" Przy okazji za pomocą jednego cytatu działa również po mojej stronie. Więc dlaczego 3 cytaty? – S12000

0

Pyspark realizacja:

W tym przykładzie przed zapisaniem zmień pole column_as_array na 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"])) 

Następnie można upuścić starą kolumnę (typ tablicy) przed zapisaniem.

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

CSV nie jest idealnym formatem eksportu, ale jeśli chcesz tylko wzrokowo swoje dane, to będzie działać [Scala]. Szybkie i brudne rozwiązanie.

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") 
Powiązane problemy