Apache spark 如何使用from_json允许消息具有不同的字段?

Apache spark 如何使用from_json允许消息具有不同的字段?,apache-spark,apache-spark-sql,spark-structured-streaming,Apache Spark,Apache Spark Sql,Spark Structured Streaming,我正在尝试使用Spark结构化流媒体处理来自Kafka的数据。接收数据的代码如下所示: val-enriched=df.select($“value”将“string”转换为“json”) 。选择(从_json($“json”,模式)作为“数据”) .选择(“数据。*”) ds是一个数据帧,其中包含从卡夫卡消费的数据 当我试图将is作为JSON来读取以便进行更快的查询时,问题就出现了。来自_json()的org.apache.spark.sql.functions的函数请求一个模式。如果消息有

我正在尝试使用Spark结构化流媒体处理来自Kafka的数据。接收数据的代码如下所示:

val-enriched=df.select($“value”将“string”转换为“json”)
。选择(从_json($“json”,模式)作为“数据”)
.选择(“数据。*”)
ds
是一个数据帧,其中包含从卡夫卡消费的数据


当我试图将is作为JSON来读取以便进行更快的查询时,问题就出现了。来自_json()的
org.apache.spark.sql.functions
的函数请求一个模式。如果消息有一些不同的字段怎么办?

正如@zero323和他或她引用的答案所暗示的那样,你在问一个矛盾的问题:当一个人不知道模式时,从本质上讲,他是如何强加模式的?当然不能。我认为使用开放式集合类型是您的最佳选择


但最终,几乎可以肯定的是,您可以使用case类来表示数据,即使这意味着需要使用大量的
选项
s、需要解析的字符串和需要查询的映射。投入精力定义该案例类。否则,您的Spark工作将实质上是大量临时的、耗时的繁忙工作

每个批处理都需要相同的模式,必须事先知道。推论毫无意义。您可以查看一些如何处理此问题的想法。@zero323谢谢您的回答!在更“理论”的部分,为什么它没有意义?我明白结构化的想法只是为了有更好的性能和优化,如果不是的话,我们或多或少回到了关系模型,对吧?我认为“just”是一种严重的轻描淡写。拥有具有众所周知的模式的结构化数据就是这样的工作。重用执行计划、内部存储、设计最佳压缩策略、与外部存储交互——这一部分。另一个是推断的成本。它需要一个完整的数据扫描,在最坏的情况下是O(N)本地内存,当您需要软实时响应时,它是不可接受的。最后,在不影响应用程序逻辑的情况下更改模式并不常见。是的,我们正在向(或多或少)关系模型靠拢。假设您可以从json自动推断模式,这有什么矛盾?