【发布时间】:2020-08-01 22:50:30
【问题描述】:
环境:Scala、spark、结构化流、kafka
我有一个来自具有以下架构的 kafka 流的 DF
DF:
BATCH ID: 0
+-----------------------+-----+---------+------+
| value|topic|partition|offset|
+-----------------------+-----+---------+------+
|{"big and nested json"}| A | 0| 0|
|{"big and nested json"}| B | 0| 0|
+-----------------------+-----+---------+------+
我想使用 spark 并行处理每一行,并且我设法将它们拆分给我的执行者使用
DF.repartition(Number).foreach(row=> processRow(row))
我需要将值列中的值提取到它自己的数据框中来处理它。 我在使用 Dataframe 通用 Row 对象时遇到了困难..
有没有办法将每个执行程序中的单行转换为自己的数据帧(使用固定模式?)并在固定位置写入? 有没有更好的方法来解决我的问题?
编辑+澄清:
使用自 spark2.4 以来存在的 writeStream 功能的 forEachBatch 函数作为批处理来接收 DF
目前将 DF 拆分为 ROWS 使得行将平均拆分为我的所有执行程序,我想将单个 GenericRow 对象转换为 DataFrame,以便我可以使用我制作的函数进行处理
例如,我会将行发送到函数
processRow(row:row)
取值和主题,转回单行DF
+-----------------------+-----+
| value|topic|
+-----------------------+-----+
|{"big and nested json"}| A |
+-----------------------+-----+
用于进一步处理
【问题讨论】:
标签: scala apache-spark apache-kafka spark-structured-streaming