我已经在本地安装了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
,然后发布。
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
。
答案 0 :(得分:0)
我认为这不可能直接实现,因为Spark中的Kafka生产者期望两列键和值,这两列都必须是字节数组。
如果您从磁盘读取现有的Avro文件,则您可能已经创建了Avro数据帧读取器的名称和工资两列。因此,您将需要一个操作来从包含整个Avro记录的其他列中构造一个value
列,然后删除其他列,然后必须使用Bijection之类的库将其序列化为字节数组,例如,因为您没有使用架构注册表。
如果您要生成数据而没有文件,则需要为Kafka消息键和字节数组值构建一个Tuple2对象列表,然后可以parallelize
到RDD,然后将它们转换为数据框。但是到那时,仅使用常规的Kafka Producer API就会简单得多。
此外,如果您已经知道自己的架构,请尝试Ways to generate test data in Kafka
中提到的项目。