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