繁体   English   中英

如何将 Spark 模式应用于 Spark Structured Streaming 中基于 Kafka 主题名称的查询?

[英]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 消息。

考虑我有两个主题: custcustomers

基于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 个不同的模式。

我可以想到两种方法:

  1. 按主题拆分您的df ,然后将您的 2 个模式应用于 2 个 dfs( custcustomers
  2. 将 2 个模式合并为 1 个模式并将其应用于所有主题。

暂无
暂无

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

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