【发布时间】:2020-03-04 07:15:05
【问题描述】:
我正在使用以下代码将数据流推送到 Azure EventHub,并利用 Microsoft.Hadoop.Avro.. 此代码每 5 秒运行一次,并且简单地将相同的两个 Avro 序列化项 ????????:
var strSchema = File.ReadAllText("schema.json");
var avroSerializer = AvroSerializer.CreateGeneric(strSchema);
var rootSchema = avroSerializer.WriterSchema as RecordSchema;
var itemList = new List<AvroRecord>();
dynamic record_one = new AvroRecord(rootSchema);
record_one.FirstName = "Some";
record_one.LastName = "Guy";
itemList.Add(record_one);
dynamic record_two = new AvroRecord(rootSchema);
record_two.FirstName = "A.";
record_two.LastName = "Person";
itemList.Add(record_two);
using (var buffer = new MemoryStream())
{
using (var writer = AvroContainer.CreateGenericWriter(strSchema, buffer, Codec.Null))
{
using (var streamWriter = new SequentialWriter<object>(writer, itemList.Count))
{
foreach (var item in itemList)
{
streamWriter.Write(item);
}
}
}
eventHubClient.SendAsync(new EventData(buffer.ToArray()));
}
这里使用的模式同样是简单的:
{
"type": "record",
"name": "User",
"namespace": "SerDes",
"fields": [
{
"name": "FirstName",
"type": "string"
},
{
"name": "LastName",
"type": "string"
}
]
}
我已经验证这一切都很好,在门户上的 Azure 流分析中有一个简单的视图:
到目前为止一切顺利,但我不能,为了我的一生,在 Databricks 中正确反序列化它利用 Scala 下的 from_avro() 命令..
将(完全相同的)模式加载为字符串:
val sampleJsonSchema = dbutils.fs.head("/mnt/schemas/schema.json")
配置 EventHub
val connectionString = ConnectionStringBuilder("<CONNECTION_STRING>")
.setEventHubName("<NAME_OF_EVENT_HUB>")
.build
val eventHubsConf = EventHubsConf(connectionString).setStartingPosition(EventPosition.fromEndOfStream)
val eventhubs = spark.readStream.format("eventhubs").options(eventHubsConf.toMap).load()
读取数据..
// this works, and i can see the serialised data
display(eventhubs.select($"body"))
// this fails, and with an exception: org.apache.spark.SparkException: Malformed records are detected in record parsing. Current parse Mode: FAILFAST. To process malformed records as null result, try setting the option 'mode' as 'PERMISSIVE'.
display(eventhubs.select(from_avro($"body", sampleJsonSchema)))
所以本质上,这里发生了什么..我正在使用与反序列化相同的模式对数据进行序列化,但是格式不正确..在这方面的文档非常稀少(在 Microsoft 网站上非常少)。
【问题讨论】:
标签: c# apache-spark azure-databricks azure-stream-analytics spark-avro