如何通过Kafka源在流式查询中处理CSV格式的值?

时间:2018-08-07 10:52:45

标签: csv apache-spark apache-kafka spark-structured-streaming

我是结构化流媒体的新手,我想知道有没有一种方法可以像常规结构化流媒体作业中那样指定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_jsonschema一起使用,也许会更快。

1 个答案:

答案 0 :(得分:0)

  

有一种方法可以指定Kafka值的模式,就像我们在常规结构化流作业中所做的一样。

不。 kafka外部数据源的所谓输出模式是固定的,无法更改。参见this line

  

如果我之前将syslog转换为JSON是否有帮助?在那种情况下,我可以在架构中使用from_json,也许会更快。

我不这么认为。我什至会说CSV是比JSON更简单的文本格式(通常通常只有一个分隔符)。

使用split标准函数是一种方法,认为您很难获得更好的性能,因为它是拆分一行并占用所有元素来构建最终输出。