当前位置: 首页 > 知识库问答 >
问题:

火花读阿夫罗

赵夕
2023-03-14

正在尝试读取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)

通用域名格式。databricks。火花阿夫罗。SchemaConverters$CompatibleSchemaException:无法将Avro架构转换为catalyst类型,因为路径处的架构不兼容(avroType=StructType(StructField(value,StringType,true)),sqlType=STRING)。源Avro架构:[“null”,“string”]。目标催化剂类型:StructType(StructField(值、StringType、true))

试图覆盖avro模式(没有null)也不起作用:

val df = spark.read
  .option("inferSchema", "false")
  .option("avroSchema", """["string"]""")
  .avro(file)

Avro模式不能转换为火花SQL结构类型:["字符串"]

看起来spark avro只创建了一个GenericDatumReader[GenericRecord],我需要一个GenericDatumReader[Utf8]:(

共有1个答案

江英卓
2023-03-14

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

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

或者,如果您有Java模式文件,则可以通过以下操作获取模式:-

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

希望对你有用。

 类似资料:
  • 我有一个avro格式的数据流(json编码),需要存储为镶木地板文件。我只能这样做, 把df写成拼花地板。 这里的模式是从json中推断出来的。但是我已经有了avsc文件,我不希望spark从json中推断出模式。 以上述方式,parquet文件将模式信息存储为StructType,而不是avro.record.type。是否也有存储avro模式信息的方法。 火花 - 1.4.1

  • 现在Spark 2.4已经内置了对Avro格式的支持,我正在考虑将数据湖中某些数据集的格式从Parquet更改为Avro,这些数据集通常是针对整行而不是特定列聚合进行查询/联接的。 然而,数据之上的大部分工作都是通过Spark完成的,据我所知,Spark的内存缓存和计算是在列格式的数据上完成的。在这方面,Parquet是否提供了性能提升,而Avro是否会招致某种数据“转换”损失?在这方面,我还需要

  • 我在一个Spark项目上工作,这里我有一个文件是在parquet格式,当我试图用java加载这个文件时,它给了我下面的错误。但是,当我用相同的路径在hive中加载相同的文件并编写查询select*from table_name时,它工作得很好,数据也很正常。关于这个问题,请帮助我。 java.io.ioException:无法读取页脚:java.lang.runtimeException:损坏的文

  • 试图读取一个空的镶木地板目录,得到这个错误 无法指定拼花地板的架构。必须手动指定 我的代码 尝试处理scala尝试和定期检查空目录 任何想法

  • 我使用以下方法将csv文件读入Spark: df=spark.read.format(file_type).options(header='true',quote='\"',ignoreleadingwhitespace='true',inferschema='true').load(file_location) 这是正常行为还是读错了? 更新:我将标记问题作为回答,因为下面的提示是有用的。然而,