【问题标题】:Spark read avroSpark 读取 avro
【发布时间】:2018-11-24 15:55:24
【问题描述】:

试图读取 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"]。 目标催化剂类型: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] :(

【问题讨论】:

  • 你试过这个val df = spark.read.option("inferSchema", "true").avro(file)
  • 是的,但是对于相同的结果,spark(正确)确定架构是 ["null", "string"] 的并集。

标签: apache-spark avro


【解决方案1】:

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

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

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

val schema = Schema.getClassSchema

现在,一旦您有了架构,就可以非常简单地用它来构建数据框。 代码 sn-p:-

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

df.printSchema()
df.show()

希望它对你有用。

【讨论】:

    猜你喜欢
    • 2019-05-11
    • 2015-10-31
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2019-10-25
    • 2022-11-24
    相关资源
    最近更新 更多