繁体   English   中英

Json 字符串应作为 Kafka 主题使用,在 Spark 结构化流中没有模式

[英]Json string should be consumed as Kafka topic without schema in spark structured streaming

我需要使用 Kafka 主题,它为每一行生成动态 Json 字符串。我无法解析没有模式的 Json 字符串。 就我而言,Schema 可以是动态的。 spark.read.json可以推断 json 模式。但它需要“数据集”或“JSON 文件”。

有什么方法可以将 Kafka 主题(值)转换为 DATASET? 这样我就可以使用spark.read.json ,它接受 DATASET 作为输入,它可以解析 json 的模式。

但是如果我使用下面的代码。

val klines = spark.
  readStream.
  format("kafka").
  option("kafka.bootstrap.servers", "host1:port1,host2:port2").
  option("subscribe", "topic").
  load().
  select($"value".cast("string").alias("value"))

val query = klines.
  select(from_json($"value",schema=spark.read.json(klines.as[String]).schema)).
  writeStream.
  format("console").
  start()

query.awaitTermination()

出现以下错误:线程“main”中的异常 org.apache.spark.sql.AnalysisException:必须使用 writeStream.start() 执行带有流式源的查询; 卡夫卡

我正在做一些中间计算,比如展平架构。 但如果我这样做,就会发生同样的错误。 我如何处理火花结构化流(scala)中的基本中间计算?

JSON 是一个字符串。 你可以只是一个字符串类型的模式。

这样我就可以使用 spark.read.json

spark.read.json来自文件系统

如果您想从 Kafka 读取数据,您可能需要spark.readStream.format("kafka") ,Spark 文档中对此进行了足够详细的描述

Spark 文档中的第一个示例正是这样做的

val df = spark
  .readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", "host1:port1,host2:port2")
  .option("subscribe", "topic1")
  .load()
df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
  .as[(String, String)]

对数据进行任何类型的有用分析都会遇到问题,但是鉴于每条记录都有可能不共享相同的字段,因此执行get_json_object之类的操作将毫无意义

可以说,您最好使用原始 Kafka 消费者 API 或 KStreams ,它们不需要任何架构,但是您的问题不是架构——它是反序列化为Object 类型,具有可以查询的具体字段

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM