试图阅读avro文件 .
val df = spark.read.avro(file)
无法将运行到Avro架构转换为Spark SQL StructType:[“null”,“string”]
试图手动创建架构,但现在运行到以下:
val s = StructType(List(StructField("value", StringType, nullable = true)))
val df = spark.read
.option("inferSchema", "false")
.schema(s)
.avro(file)
com.databricks.spark.avro.SchemaConverters $ IncompatibleSchemaException:无法将Avro架构转换为催化剂类型,因为路径上的架构不兼容(avroType = StructType(StructField(value,StringType,true)),sqlType = STRING) . 源Avro架构:[“null”,“string”] . 目标Catalyst类型:StructType(StructField(value,StringType,true))
尝试覆盖avro架构(没有null)也不起作用:
val df = spark.read
.option("inferSchema", "false")
.option("avroSchema", """["string"]""")
.avro(file)
Avro架构无法转换为Spark SQL StructType:[“string”]
看起来像spark-avro只创建一个GenericDatumReader [GenericRecord],我需要一个GenericDatumReader [Utf8] :(
1 回答
请确保您提供的数据类型正确的AVSC . [“null”,“String”]用于处理Avro数据中的空值 . 您可以通过以下方式创建Avro文件的架构: -
或者,如果您有Java Schema文件,那么您可以通过以下方式获取架构: -
现在,一旦你有了架构,用它构建数据框就非常简单了 . 代码片段: -
希望对你有效 .