2016-04-20 14 views
15

Sto provando a passare dalla lettura di file flat CSV a file AVRO su spark. seguito https://github.com/databricks/spark-avro io uso:Leggere un mix non supportato di tipi di unione da un file Avro in 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") 

e ottenere

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

il file README chiaramente:

Questa libreria supporta la lettura di tutti i tipi Avro, con l'eccezione di complesso tipi di unione. Utilizza la seguente mappatura da tipi Avro ai tipi SQL Spark:

quando provo a textread lo stesso file posso vedere lo 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": "log_record" , "type": "record", "campi": [{ "name": "richiesta", "tipo": { "type": "record", "name": "request_data", "campi": [{ "name": "datetime", "type": "stringa"}, { "name": "ip", "type": "stringa"}, { "name": "host", "type": "stringa "}, {" name ":" uri " "type": "stringa"}, { "name": "REQUEST_URI", "type": "stringa"}, { "nome: tipo di referer """" ":" stringa "}, {" nome ":" useragent "," tipo ":" stringa "}]}}

< ------- un estratto della piena risposta ------->

dal momento che ho poco controllo sul formato sto ottenendo questi file, mia domanda qui è - c'è una soluzione che qualcuno ha testato e in grado di consigliare?

Io uso dataproc gc con

MASTER = filato cluster scintilla shell --num-esecutori 4 --executor memoria 4G --executor-core 4 --packages com.databricks: scintilla -avro_2.10: 2.0.1, com.databricks: scintilla csv_2.11: 1.3.0

qualsiasi aiuto sarebbe molto apprezzato .....

+0

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

+1

puoi usare newHadoopApi per leggendo i file avro - dovrai usare l'api core di spark e non sql-api. qualche motivo speciale per non usarlo? –

risposta

2

si trova qualsiasi soluzione che funziona con Spark SQL. Ogni colonna di Spark deve contenere valori che possono essere rappresentati come un singolo DataType, quindi tipi di unione complessi non sono semplicemente rappresentabili con Spark Dataframe.

Se si desidera leggere dati come questo, è necessario utilizzare l'API RDD e convertire i dati caricati in DataFrame in seguito.

Problemi correlati