Я использую структурированную потоковую передачу для чтения данных из Кафки и их обработки. Данные авро сериализуются. У меня есть случай использования, когда один topi c может иметь несколько схем. Я не уверен, как с ними справиться.
Вот как выглядит kafka topi c (пример)
{"key":"schema1", "value": {"actual avro data}}
{"key":"schema2", "value": {"actual avro data}}
Так мы планировали читать данные с использованием spark , но я считаю, что этот подход не будет работать
val avroPayload = x.select(
x("key").cast(StringType) as 'key,
x("value") as 'record
).select("record","key")
val retVal = avroPayload.select(
col("key"),
col("record"),
schemaResolverr(col("key")).alias("schema1")
)
val b = retVal.select(
from_avro(col("record"),(col("schema1").toString()))
)
, где x - это DataFrame из потоковой передачи, schemaResolverr берет ключ в DF и возвращает схему из состояния c mapping
Это пример схемы
{"namespace": "app.avro",
"type": "record",
"name": "schema1",
"fields": [
{"name": "col1","type": ["null","string"], "default": null},
{"name": "col2","type": ["null","string"], "default": null},
{"name": "col3","type": ["null","string"], "default": null},
{"name": "col4","type": ["null","string"], "default": null}
]
}
Поскольку в фрейме данных может быть только одна схема, я не уверен, как это сработает. Пожалуйста, дайте мне знать, если нужна дополнительная информация