2016-04-20 10 views
15

Ich versuche, vom Lesen von CSV-Dateien in AVRO-Dateien auf Spark zu wechseln. folgenden https://github.com/databricks/spark-avro Ich benutze:Eine nicht unterstützte Mischung von Union-Typen aus einer Avro-Datei in Apache Spark lesen

import com.databricks.spark.avro._ 
val sqlContext = new org.apache.spark.sql.SQLContext(sc) 
val df = sqlContext.read.avro("gs://logs.xyz.com/raw/2016/04/20/div1/div2/2016-04-20-08-28-35.UTC.blah-blah.avro") 

und klar

java.lang.UnsupportedOperationException: This mix of union types is not supported (see README): ArrayBuffer(STRING) 

die Readme-Datei Staaten erhalten:

Diese Bibliothek unterstützt alle Avro-Typen zu lesen, mit der Ausnahme von Komplex Verbindungstypen. Es verwendet die folgende Abbildung von Avro Typen Spark-SQL-Typen: "log_record":

wenn ich versuche, die gleiche Datei textread ich das Schema

val df = sc.textFile("gs://logs.xyz.com/raw/2016/04/20/div1/div2/2016-04-20-08-28-35.UTC.blah-blah.avro") 
df.take(2).foreach(println) 

{ "name" sehen , "Typ": "Datensatz", "Felder": [{"Name": "Anfrage", "Typ": {"Typ": "Datensatz", "Name": "Anfrage_Daten", "Felder": [{ "name": "datetime", "type": "string"}, {"name": "ip", "type": "string"}, {"name": "host", "type": "string "}, {" name ":" uri "," typ ":" string "}, {" name ":" request_uri "," typ ":" string "}, {" name ":" referer "," type ":" string "}, {" name ":" useragent "," type ":" string "}]}}

< ------- ein Auszug aus der vollständigen Antwort ------->

da ich nur wenig Kontrolle über das Format habe ich diese Dateien in, immer meine Frage ist hier - gibt es eine Ausweichlösung jemand getestet und kann empfehlen?

I verwenden gc Dataproc mit

MASTER = Garn-cluster funken Schale --num-Vollstrecker 4 --executor-Speicher-4G --executor Kerne 4 --packages com.databricks: spark -avro_2.10: 2.0.1, com.databricks: Funken csv_2.11: 1.3.0

jede Hilfe wäre sehr dankbar .....

+0

http://stackoverflow.com/questions/23944615/how-can-i-load-avros-in-spark-use-the-schema-on-board-the-avro-files – Simon

+1

Sie können newHadoopApi für verwenden Lesen von Avro-Dateien - Sie müssen Core API von Spark und nicht SQL-API verwenden. ein besonderer Grund, es nicht zu benutzen? –

Antwort

2

Sie eine Lösung finden, die mit Arbeiten Spark SQL. Jede Spalte in Spark muss Werte enthalten, die als einzelne DataType dargestellt werden können, so dass komplexe Verbindungstypen einfach nicht mit Spark Dataframe darstellbar sind.

Wenn Sie Daten wie diese lesen möchten, sollten Sie die RDD-API verwenden und geladene Daten später in DataFrame konvertieren.