在Avro模式不允许递归引用

Apache Avro数据源不能递归引用模式一起使用时火花。

写的saikrishna.pujari

去年发表在:2022年12月1日

问题

Apache火花返回一个错误当试图读取一个Apache Avro数据源如果Avro模式有一个递归引用。

org.apache.spark.sql.avro。IncompatibleSchemaException:发现递归引用Avro模式中,不能处理的火花

导致

火花SQL不支持递归在一个Avro数据源引用,因为它是不可能的转换模式StructType

检查[火花- 25718][SQL]发现递归引用在Avro模式和抛出异常将请求更多的信息。

解决方案

你必须避免使用递归引用Avro模式。

测试递归引用

你可以测试你的Avro递归引用的模式SchemaConverters.toSqlType (< avro-schema >)

sql进口org.apache.spark.sql.avro %。SchemaConverters SchemaConverters.toSqlType (< avro-schema >)

如果Avro模式包含递归引用,SchemaConverters.toSqlType返回一个错误。

例子

  1. 用递归引用创建一个Avro模式。
    sql进口org.apache.avro %。模式val = new Schema.Parser ()。解析(“”“{“类型”:“记录”,“名字”:“入围”,“别名”:“LinkedLongs”,“字段”:[{“名称”:“价值”、“类型”:“长”},{“名称”:“下一个”、“类型”:[“空”、“入围”]}]}" " ")
  2. 测试模式SchemaConverters.toSqlType
    sql进口org.apache.spark.sql.avro %。SchemaConverters SchemaConverters.toSqlType(模式)
  3. 它返回一个IncompatibleSchemaException错误。
    IncompatibleSchemaException: Avro模式中发现递归引用,它不能处理火花:{“类型”:“记录”,“名字”:“入围”,“字段”:[{“名称”:“价值”、“类型”:“长”},{“名称”:“下一个”、“类型”:[“空”、“入围”]}],“别名”:[" LinkedLongs "]}





这篇文章有用吗?