这实际上与我之前的问题相同,但使用Avro而不是JSON作为数据格式.
我正在使用Spark数据帧,它可以从几个不同的模式版本之一加载数据:
// Version One
{"namespace": "com.example.avro",
"type": "record",
"name": "MeObject",
"fields": [
{"name": "A", "type": ["null", "int"], "default": null}
]
}
// Version Two
{"namespace": "com.example.avro",
"type": "record",
"name": "MeObject",
"fields": [
{"name": "A", "type": ["null", "int"], "default": null},
{"name": "B", "type": ["null", "int"], "default": null}
]
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Spark Avro加载数据.
DataFrame df = context.read()
.format("com.databricks.spark.avro")
.load("path/to/avro/file");
Run Code Online (Sandbox Code Playgroud)
可以是Version One文件或Version Two文件.但是我希望能够以相同的方式处理它,将未知值设置为"null".我之前的问题中的建议是设置模式,但是我不想重复自己在.avro文件和火花StructType和朋友中编写模式.如何将avro架构(文本文件或生成的MeObject.getClassSchema())转换为火花StructType?
Spark Avro有一个SchemaConverters,但它都是私有的,并返回一些奇怪的内部对象.