2016-04-20 2 views
15

Próbuję przejść od czytania płaskich plików csv do plików avro na iskrze. następujące https://github.com/databricks/spark-avro używam:Przeczytaj nieobsługiwaną mieszankę typów złącz z pliku Avro w Apache Spark

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

i dostać

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

stany plików readme wyraźnie:

Ta biblioteka obsługuje przeczytaniu wszystkich Avro typów, z wyjątkiem kompleksu typy związków. Wykorzystuje następujące odwzorowanie Avro rodzajów typów SQL Spark:

gdy próbuję textread tego samego pliku widzę schematu

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": "log_record" , "type": "record", "fields": [{"name": "request", "type": {"type": "record", "name": "request_data", "fields": [{ "nazwa": "datetime", "type": "string"}, {"name": "ip", "type": "string"}, {"name": "host", "type": "string" "}, {" name ":" uri "," type ":" string "}, {" name ":" request_uri "," type ":" string "}, {" name ":" referer "," type " ":" string "}, {" name ":" useragent "," type ":" string "}]}}

< ------- fragment pełnej odpowiedzi ------->

ponieważ mam małą kontrolę nad formatem dostaję te pliki, mój Pytanie tutaj brzmi - czy istnieje obejście, które ktoś przetestował i czy może polecić?

użyć gc dataproc z

master = przędzy klastra zapłonem powłoki --num-wykonawców 4 --executor pamięć 4G --executor rdzeni 4 --packages com.databricks: zapłonowe -avro_2.10: 2.0.1, com.databricks: zapłonie csv_2.11: 1.3.0

każda pomoc będzie bardzo mile widziane .....

+0

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

+1

możesz użyć newHadoopApi dla czytanie plików avro - będziesz musiał użyć core api iskry, a nie sql-api. jakiś szczególny powód, aby go nie używać? –

Odpowiedz

2

znaleźć żadnego rozwiązania, które współpracuje z Spark SQL. Każda kolumna w Spark musi zawierać wartości, które mogą być reprezentowane jako pojedynczy DataType, więc skomplikowane typy związków nie są po prostu reprezentowane przez Spark Dataframe.

Jeśli chcesz odczytać dane takie jak to, powinieneś użyć RDD API i przekonwertować załadowane dane na DataFrame później.