如何在以kafka为来源的Spark结构化流中识别消息的来源?

时间:2019-06-24 07:19:33

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

我有一个用例,其中我必须以 spark结构化流订阅kafka中的多个主题。然后,我必须解析每个消息,并从中组成一个三角洲湖泊表。我已经使解析器和消息(以xml形式)正确地解析并形成了delta-lake表。但是,到目前为止,我仅订阅一个主题。我想订阅多个主题,并且基于该主题,它应该转到为该特定主题专门设计的解析器。因此,基本上,我想在处理所有消息时为它们确定主题名称,以便将它们发送到所需的解析器并进一步处理。

这是我从不同主题访问消息的方式。但是,我不知道如何在处理传入消息时识别它们的来源。

 val stream_dataframe = spark.readStream
  .format(ConfigSetting.getString("source"))
  .option("kafka.bootstrap.servers", ConfigSetting.getString("bootstrap_servers"))
  .option("kafka.ssl.truststore.location", ConfigSetting.getString("trustfile_location"))
  .option("kafka.ssl.truststore.password", ConfigSetting.getString("truststore_password"))
  .option("kafka.sasl.mechanism", ConfigSetting.getString("sasl_mechanism"))
  .option("kafka.security.protocol", ConfigSetting.getString("kafka_security_protocol"))
  .option("kafka.sasl.jaas.config",ConfigSetting.getString("jass_config"))
  .option("encoding",ConfigSetting.getString("encoding"))
  .option("startingOffsets",ConfigSetting.getString("starting_offset_duration"))
  .option("subscribe",ConfigSetting.getString("topics_name"))
  .option("failOnDataLoss",ConfigSetting.getString("fail_on_dataloss")) 
  .load()


 var cast_dataframe = stream_dataframe.select(col("value").cast(StringType))

 cast_dataframe =  cast_dataframe.withColumn("parsed_column",parser(col("value"))) // Parser is the udf, made to parse the xml from the topic. 

当消息在Spark结构化流中处理时,如何确定消息的主题名称?

1 个答案:

答案 0 :(得分:1)

根据official documentation(重点是我的)

  

源代码中的每一行都具有以下架构:

     

列类型   


  密钥二进制   
  值二进制   
  主题字符串   
  分区int

     

...

如您所见,输入主题是输出架构的一部分,无需任何特殊操作即可进行访问。