Apache spark 如何将数据帧(从foreach内部的RDD构建)写入Kafka?

Apache spark 如何将数据帧(从foreach内部的RDD构建)写入Kafka?,apache-spark,apache-kafka,spark-streaming,kafka-producer-api,Apache Spark,Apache Kafka,Spark Streaming,Kafka Producer Api,我正试图编写一个从Spark到Kafka的数据框架,但我找不到任何解决方案。你能告诉我怎么做吗 这是我目前的代码: activityStream.foreachRDD{rdd=> val activityDF=rdd .toDF() .selectExpr( “时间戳\小时”、“推荐人”、“操作”, “prevPage”、“page”、“visitor”、“product”、“inputProps.topic作为主题”) val PRODUCTERRECORD=新PRODUCTERRECORD(

我正试图编写一个从Spark到Kafka的
数据框架,但我找不到任何解决方案。你能告诉我怎么做吗

这是我目前的代码:

activityStream.foreachRDD{rdd=>
val activityDF=rdd
.toDF()
.selectExpr(
“时间戳\小时”、“推荐人”、“操作”,
“prevPage”、“page”、“visitor”、“product”、“inputProps.topic作为主题”)
val PRODUCTERRECORD=新PRODUCTERRECORD(topicc,activityDF)

kafkaProducer.send(producerRecord)/Do
collect
activityDF
上获取记录(非
Dataset[Row]
)并将其保存到Kafka

请注意,在
collect
之后,您将得到一个记录集合,因此您可能需要对其进行迭代,例如

val activities = activityDF.collect()
// the following is pure Scala and has nothing to do with Spark
activities.foreach { a: Row =>
  val pr: ProducerRecord = // map a to pr
  kafkaProducer.send(pr)
}
行上使用模式匹配
将其分解为字段/列,例如

activities.foreach { case Row(timestamp_hour, referrer, action, prevPage, page, visitor, product, topic) =>
  // ...transform a to ProducerRecord
  kafkaProducer.send(pr)
}
PROTIP:我强烈建议使用
case类
并将
DataFrame
(=
Dataset[Row]
)转换为
Dataset[YourCaseClass]

参见Spark SQL和Kafka的文档


正如评论中指出的那样:

如果在写入任何端点之前进行“收集”,则会在驱动程序中聚合所有数据,然后让驱动程序将其写入。1)如果数据过多,则会导致驱动程序崩溃(2)写入时没有并行性

那是100%正确。我希望我说的是:)


您可能希望使用中描述的方法。

类型不匹配;找到:org.apache.kafka.clients.producer.ProducerRecord[Nothing,org.apache.spark.sql.DataFrame](扩展为)org.apache.kafka.clients.ProducerRecord[Nothing,org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]]必需:org.apache.kafka.clients.producer.ProducerRecord[Nothing,String]在包含默认参数的应用程序中发生错误。能否将编译器错误添加/粘贴到问题中?如果执行“收集”在写入任何端点之前,它将在驱动程序处聚合所有数据,然后让驱动程序将其写入。1)如果数据过多,可能会导致驱动程序崩溃(2)写入时没有并行性。这里有更好的解决方案: