2017-04-21 4 views
0

Ich versuche, eine CSV-Datei mit diesem Schema zu konvertieren:PySpark Schema nicht erkannt

sch = StructType([ 
    StructField("id", StringType(), True), 
    StructField("words", ArrayType((StringType())), True) 
]) 

dataFile = 'mycsv.csv' 

df = sqlContext.read.option("mode", "DROPMALFORMED").schema(sch).option("delimiter", format(",")).option("charset", "UTF-8").load(dataFile, format='com.databricks.spark.csv', header='true', inferSchema='false') 

mycsv.csv enthält:

id , words 
a , test here 

I df [Row(id='a', words=['test' , 'here'])]

enthalten erwarten aber stattdessen ist es ein leeres Array, wie df.collect() zurückgibt []

Ist mein Schema korrekt definiert?

Antwort

1

Nun, eindeutig Ihre words Spalte ist nicht vom Typ Array seine vom Typ StringType() nur. Da DROPMALFORMED aktiviert ist, werden die Datensätze gelöscht, da sie nicht mit dem Array-Schema übereinstimmen. Versuchen Schema wie unten und es sollte funktionieren -

sch = StructType([ 
    StructField("id", StringType(), True), 
    StructField("words", StringType(), True) 
]) 

edit: wenn Sie wirklich wirklich 2. Spalte als Array/Liste der Wörter wollen, dies zu tun -

from pyspark.sql.functions import split 
df.select(df.id,split(df.words," ").alias('words')).show() 

diese Ausgänge:

+---+--------------+ 
| id|   words| 
+---+--------------+ 
| a |[, test, here]| 
+---+--------------+