在Spark结构化流媒体中逐行拆分Kafka消息

时间:2019-02-08 11:02:42

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

我想在我的Spark结构化流作业中将Kafka主题的消息读入数据帧。但是我将整个消息放在一个偏移中,因此在数据帧中,仅此消息进入一行而不是多行。 (在我的情况下是3行)

打印此消息时,我得到以下输出:

enter image description here

我希望在数据帧的3行中显示消息“ Text1”,“ Text2”和“ Text3”,以便我进一步处理。

请帮助我。

1 个答案:

答案 0 :(得分:0)

您可以使用用户定义函数(UDF)将消息字符串转换为字符串序列,然后在该列上应用 explode 函数来创建序列中每个元素的新行:

如下图所示(在scala中,相同的原理也适用于pyspark):

case class KafkaMessage(offset: Long, message: String)

import org.apache.spark.sql.functions.udf
import org.apache.spark.sql.functions.explode

val df = sc.parallelize(List(KafkaMessage(1000, "Text1\nText2\nText3"))).toDF()

val splitString = udf { s: String => s.split('\n') }

df.withColumn("splitMsg", explode(splitString($"message")))
  .select("offset", "splitMsg")
  .show()

这将产生以下输出:

+------+--------+
|offset|splitMsg|
+------+--------+
|  1000|   Text1|
|  1000|   Text2|
|  1000|   Text3|
+------+--------+