如何将DataFrame(从fored中的RDD构建)写入Kafka?

时间:2017-04-17 16:26:54

标签: apache-spark apache-kafka spark-streaming kafka-producer-api

我试图从Spark写一个{​​{1}}到Kafka,但我找不到任何解决方案。你能告诉我怎么做吗?

这是我目前的代码:

DataFrame

类型不匹配;发现:org.apache.kafka.clients.producer.ProducerRecord [Nothing,org .apache.spark.sql.Da taFrame](扩展为)org.apache.kafka.clients.producer.ProducerRecord [Nothing,org .apache.spark.sql.Da taset [org.apache.spa rk.sql.Row]]必需:org.apache.kafka.clients.producer.ProducerRecord [Nothing,Str ing]涉及的应用程序出错默认参数。

1 个答案:

答案 0 :(得分:0)

activityDF上的Dataset[Row]获取记录(不是collect)并将其保存到Kafka。

请注意,您将在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) } 之后得到一组记录,因此您可能需要对其进行迭代,例如。

Row

使用activities.foreach { case Row(timestamp_hour, referrer, action, prevPage, page, visitor, product, topic) => // ...transform a to ProducerRecord kafkaProducer.send(pr) } 上的模式匹配将其解构为字段/列,例如

case class

PROTIP:我强烈建议您使用DataFrame并将Dataset[Row](= Dataset[YourCaseClass])转换为 <?php $json_string = file_get_contents("https://en.wikivoyage.org/w/api.php?action=query&prop=revisions&rvprop=content&format=jsonfm&titles=Ladakh"); $parsed_json = json_decode($json_string, true); $parsed_data = $parsed_json['batchcomplete']['query']['pages']['18687']['revisions']; foreach($parsed_data as $key => $value) { echo $value['*']; } ?>

请参阅Spark SQL的Row和Kafka的ProducerRecord文档。

正如Joe Nate在评论中指出的那样:

  

如果在写入任何端点之前进行“收集”,它将使所有数据聚合在驱动程序上,然后让驱动程序将其写出来。 1)如果数据太多(2)写入没有并行性,可能会导致驱动程序崩溃。

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

您可能希望使用Writing Stream Output to Kafka中描述的方法。