[英]Spark Streaming + Kafka: how to check name of topic from kafka message
[英]How to apply Spark schema to the query based on Kafka topic name in Spark Structured Streaming?
我有一个 Spark Structured Streaming 作业,它基于subscribePattern
从多个 Kafka 主题流式传输数据,并且对于每个 Kafka 主题,我都有一个 Spark 模式。 从 Kafka 流式传输数据时,我想根据主题名称将 Spark 模式应用于 Kafka 消息。
考虑我有两个主题: cust和customers 。
基于subscribePattern
(Java 正则表达式字符串)从 Kafka 流式传输数据:
var df = spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "host1:port1,host2:port2")
.option("subscribePattern", "cust*")
.option("startingOffsets", "earliest")
.load()
.withColumn("value", $"value".cast("string"))
.filter($"value".isNotNull)
上述流式查询流式传输来自两个主题的数据。
假设我有两个 Spark 模式,每个主题都有一个:
var cust: StructType = new StructType()
.add("name", StringType)
.add("age", IntegerType)
var customers: StructType = new StructType()
.add("id", IntegerType)
.add("first_name", StringType)
.add("last_name", StringType)
.add("email", StringType)
.add("address", StringType)
现在,我想根据主题名称应用 Spark Schema,为此我编写了一个 udf,它读取主题名称并以 DDL 格式返回架构:
val schema = udf((table: String) => (table) match {
case ("cust") => cust.toDDL
case ("customers") => customers.toDDL
case _ => new StructType().toDDL
})
然后我在from_json方法中使用 udf(我知道 udf 适用于每一列),如下所示:
val query = df
.withColumn("topic", $"topic".cast("string"))
.withColumn("data", from_json($"value", schema($"topic")))
.select($"key", $"topic", $"data.*")
.writeStream.outputMode("append")
.format("console")
.start()
.awaitTermination()
这给了我以下正确的异常,因为from_json需要 DDL 格式或 StructType 的字符串模式。
org.apache.spark.sql.AnalysisException: Schema should be specified in DDL format as a string literal or output of the schema_of_json function instead of UDF(topic);
我想知道如何做到这一点?
任何帮助将不胜感激!
你在做什么是不可能的。 您的query
df 不能有 2 个不同的模式。
我可以想到两种方法:
df
,然后将您的 2 个模式应用于 2 个 dfs( cust
和customers
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.