Прочитайте неподдерживаемое сочетание типов объединения из файла Avro в Apache Spark

Я пытаюсь переключиться с чтения плоских файлов csv на файлы avro на искру. после https://github.com/databricks/spark-avro Я использую:

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

и получим

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

в файле readme четко указано:

Эта библиотека поддерживает чтение всех типов Avro, с исключением сложные типы объединения. Он использует следующее сопоставление типов Avro для Типы Spark SQL:

когда я пытаюсь передать текст в тот же файл, я вижу схему

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)

{ "имя" : "log_record", "тип" : "запись", "полей": [{ "имя" : "запрос", "тип" : { "типа": "запись", "имя" : "request_data", "поле": [{ "имя" : "Дата и время", "типа": "строка" }, { "имя" : "ф", "тип" : "строка" }, { "имя" : "хозяин", "тип" : "строка" }, { "имя" : "URI", "тип" : "строка" }, { "имя" : "REQUEST_URI", "тип" : "строка" }, { "имя" : "реферер", "тип" : "строка" }, { "имя" : "UserAgent", "тип" : "строка" }]}}

< ------- отрывок полного ответа ------- >

так как у меня мало контроля над форматом, в который я получаю эти файлы, мой вопрос здесь - есть ли обходной путь, который кто-то тестировал и может рекомендовать?

Я использую gc dataproc с

MASTER = прямая кластерная искровая оболочка -num-executors 4 --executor-memory 4G -executor-core 4 --packages com.databricks: spark-avro_2.10: 2.0.1, com.databricks: искровой csv_2.11:1.3.0

любая помощь будет принята с благодарностью.....

Ответы

Ответ 1

Вы найдете любое решение, которое работает с Spark SQL. Каждый столбец в Spark должен содержать значения, которые могут быть представлены как один DataType, поэтому сложные типы объединения просто не представляются с помощью Spark Dataframe,

Если вы хотите читать такие данные, вы должны использовать RDD API и позже конвертировать загруженные данные в Dataframe.