Apache spark 如何将数据帧(从foreach内部的RDD构建)写入Kafka?
我正试图编写一个从Spark到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(
数据框架,但我找不到任何解决方案。你能告诉我怎么做吗
这是我目前的代码:
activityStream.foreachRDD{rdd=>
val activityDF=rdd
.toDF()
.selectExpr(
“时间戳\小时”、“推荐人”、“操作”,
“prevPage”、“page”、“visitor”、“product”、“inputProps.topic作为主题”)
val PRODUCTERRECORD=新PRODUCTERRECORD(topicc,activityDF)
kafkaProducer.send(producerRecord)/Docollect
在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)写入时没有并行性。这里有更好的解决方案: