我是结构化流媒体的新手,我想知道有没有一种方法可以像常规结构化流媒体作业中那样指定Kafka值的schema
。 Kafka值的格式为50多个类似syslog的csv字段,而手动拆分非常缓慢。
这是我的代码的简短部分(see full gist here)
spark.readStream.format("kafka")
.option("kafka.bootstrap.servers", "myserver:9092")
.option("subscribe", "mytopic")
.load()
.select(split('value, """\^""") as "raw")
.select(ColumnExplode('raw, schema.size): _*) // flatten WrappedArray
.toDF(schema.fieldNames: _*) // apply column names
.select(fieldsWithTypeFix: _*) // cast column types from string
.select(schema.fieldNames.map(col): _*) // re-order columns, as defined in schema
.writeStream.format("console").start()
没有进一步的操作,我只能在24核128GB的内存服务器上实现大约10MB / s的吞吐量。如果我之前将syslog转换为JSON是否有帮助?在那种情况下,我可以将from_json
与schema
一起使用,也许会更快。
答案 0 :(得分:0)
有一种方法可以指定Kafka值的模式,就像我们在常规结构化流作业中所做的一样。
不。 kafka外部数据源的所谓输出模式是固定的,无法更改。参见this line。
如果我之前将syslog转换为JSON是否有帮助?在那种情况下,我可以在架构中使用from_json,也许会更快。
我不这么认为。我什至会说CSV是比JSON更简单的文本格式(通常通常只有一个分隔符)。
使用split
标准函数是一种方法,认为您很难获得更好的性能,因为它是拆分一行并占用所有元素来构建最终输出。