我试图从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]涉及的应用程序出错默认参数。
答案 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中描述的方法。