将数据框的多列写入Scala中的Kafka

时间:2019-08-13 17:01:20

标签: scala dataframe apache-kafka apache-spark-sql kafka-producer-api

this question为基础,如何将数据框的所有列写入kafka主题。

当前我有一个带有一些列的数据框,我应该用一个键将其写入kafka,因此我从旧的数据框创建一个新的数据框并指定键和值:

val endDf: DataFrame = midDf.withColumn("key",lit(keyval)).withColumn("value",lit(testVal))

现在,当我将其写到kafka时,我指定:

endDf.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
  .write
  .format("kafka")
  .option("kafka.bootstrap.servers", "test:8808")
  .option("topic", "topic1")
  .save()

如果value是单个列,则此方法有效。但是初始数据帧由多列组成,我需要将所有这些都以JSON格式编写。

我如何将所有列写为value。我觉得它围绕着使用interDf.columnsto_json

的合并

1 个答案:

答案 0 :(得分:1)

Kafka需要一个和一个 value ;因此,您必须使用to_json()将所有剩余的列(即键列除外)聚合为一个值:

import org.apache.spark.sql.functions._

val value_col_names = endDf.columns.filter(_ != "yourKeyColumn") 

endDf.withColumnRenamed("yourKeyColumn", "key") \ 
     .withColumn("value", to_json(struct(value_col_names.map(col(_)):_*))) \
     .select("key", "value") \ 
     .write() \ 
     .format("kafka") \ 
     .option("kafka.bootstrap.servers", "test:8808") \ 
     .option("topic", "topic1") \ 
     .save()