如何使用kafka作为源处理结构化流中的每个值?

时间:2019-05-29 14:41:27

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

我有问题要解决。我有一个kafka生产者,它生产到特定主题的messages(xmls)。现在,这是一个流数据,我正在使用Spark流从主题中获取那些消息。我正在将这些消息写到控制台输出。现在,需要对这些消息执行操作(它们基本上是xml),这些xml需要解析,我也为此编写了解析器。现在,当我将xml硬编码为字符串变量时,解析器运行良好。但是,我需要从spark数据框获取xml。到目前为止,这是我从kafka接收消息的方法。

  val spark = SparkSession.builder
  .appName("kafka-ingestion")
  .master("local")
  .config("spark.sql.orc.impl","native")
  .getOrCreate()

 import spark.implicits._

 // Gets the xpath
 //val xpaths = get_xpaths(filename)
 val df = spark
   .readStream
   .format("kafka")
   .option("kafka.bootstrap.servers", "localhost:9092")
   .option("subscribe", "xmlpoc")
   .option("encoding","UTF-8")
   .option("startingOffsets", "earliest")
   .load()

val df2 = df.selectExpr( "CAST(value AS STRING)")

df2.writeStream.format("console")
  .outputMode("append")
  .start().awaitTermination()

// Now perform parsing on each value of df2.

执行此操作时,我可以看到数据框中所有消息发送到控制台。但是,我希望对所有这些消息执行操作(例如在此处解析)。我不知道该怎么做。我尝试了udfs,但除了我的value列外,它们还添加了另一列。因此,似乎没有任何效果。任何帮助表示赞赏。

0 个答案:

没有答案