[英]Produce Avro topic to Kafka using Apache Spark
我已经在本地安装了kafka(目前还没有群集/模式注册表),并试图生成一个Avro主题,下面是与该主题相关的架构。
{
"type" : "record",
"name" : "Customer",
"namespace" : "com.example.Customer",
"doc" : "Class: Customer",
"fields" : [ {
"name" : "name",
"type" : "string",
"doc" : "Variable: Customer Name"
}, {
"name" : "salary",
"type" : "double",
"doc" : "Variable: Customer Salary"
} ]
}
我想创建一个简单的SparkProducerApi
以基于上述架构创建一些数据并将其发布到kafka。 考虑创建示例数据,将其转换为dataframe
avro
,然后将其更改为avro
,然后发布。
val df = spark.createDataFrame(<<data>>)
然后,如下所示:
df.write
.format("kafka")
.option("kafka.bootstrap.servers","localhost:9092")
.option("topic","customer_avro_topic")
.save()
}
现在可以manually
将模式附加到该Avro主题。
可以仅通过使用Apache Spark APIs
而不是使用Java/Kafka Apis
来完成此操作吗? 这是用于批处理而不是streaming
处理。
我认为这不可能直接实现,因为Spark中的Kafka生产者期望两列键和值,这两列都必须是字节数组。
如果从磁盘读取现有的Avro文件,则您可能已经使用Avro数据帧读取器创建了两列,分别用于名称和薪水。 因此,您将需要一个操作从包含整个Avro记录的其他操作构造一个value
列,然后删除其他列,然后必须使用Bijection之类的库将其序列化为字节数组,例如,因为您没有使用架构注册表。
如果要生成数据但没有文件,则需要为Kafka消息键和字节数组值构建Tuple2对象列表,然后可以将它们parallelize
化为RDD,然后将其转换放入数据框。 但是到那时,仅使用常规的Kafka Producer API更加简单。
另外,如果您已经知道自己的架构,请尝试方法中提到的项目以在Kafka中生成测试数据
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.