从Apache Spark中的Avro文件中读取不受支持的联合类型组合

Zah*_*Mor 15 scala apache-spark apache-spark-sql spark-avro

我正试图从读取csv平面文件切换到spark上的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")
Run Code Online (Sandbox Code Playgroud)

得到

java.lang.UnsupportedOperationException: This mix of union types is not supported (see README): ArrayBuffer(STRING)
Run Code Online (Sandbox Code Playgroud)

自述文件清楚地说明:

此库支持读取所有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)
Run Code Online (Sandbox Code Playgroud)

{ "名称": "log_record", "类型": "记录", "字段":[{ "名称": "请求", "类型":{ "类型": "记录", "名称":"request_data " "字段":[{ "名称": "日期时间", "类型": "串"},{ "名称": "IP", "类型": "串"},{ "名称":" 主机" "类型": "串"},{ "名称": "URI", "类型": "串"},{ "名称": "REQUEST_URI", "类型": "串"},{" 名":" 引用者", "类型": "串"},{ "名称": "用户代理", "类型": "串"}]}}

<-------完整回复的摘录------->

因为我无法控制我收到这些文件的格式,我的问题是 - 是否有人测试并可以推荐?

我用gc dataproc

MASTER = yarn-cluster spark-shell --num-executors 4 --executor-memory 4G --executor-cores 4 --packages com.databricks:spark-avro_2.10:2.0.1,com.databricks:spark-csv_2 0.11:1.3.0

任何帮助将不胜感激.....

小智 5

您找不到任何适用于 Spark SQL 的解决方案。Spark 中的每一列都必须包含可以表示为单个的值,DataType因此 Spark 根本无法表示复杂的联合类型Dataframe

如果你想读取这样的数据,你应该使用 RDD API 并将加载的数据转换为DataFrame稍后的数据。