首页 文章

Spark阅读avro

提问于
浏览
1

试图阅读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 回答

  • 0

    请确保您提供的数据类型正确的AVSC . [“null”,“String”]用于处理Avro数据中的空值 . 您可以通过以下方式创建Avro文件的架构: -

    val schema = new Schema.Parser().parse(new File("user.avsc")
    

    或者,如果您有Java Schema文件,那么您可以通过以下方式获取架构: -

    val schema = Schema.getClassSchema
    

    现在,一旦你有了架构,用它构建数据框就非常简单了 . 代码片段: -

    val df =sparkSession.read.format("com.databricks.spark.avro")
          .option("avroSchema", schema.toString)
          .load("/home/garvit.vijay/000009_0.avro")
    
    df.printSchema()
    df.show()
    

    希望对你有效 .

相关问题