我想从Hive中读取一个表并写入Kafka Producer(批处理作业)。
当前,我正在java类中以Dataset<Row>
的形式读取表,并尝试转换为json,以便可以使用KafkaProducer编写为json消息。
Dataset<Row> data = spark.sql("select * from tablename limit 5");
List<Row> rows = data.collectAsList();
for(Row row: rows) {
List<String> stringList = new ArrayList<String>(Arrays.asList(row.schema().fieldNames()));
Seq<String> row_seq = JavaConverters.asScalaIteratorConverter(stringList.iterator()).asScala().toSeq();
Map map = (Map) row.getValuesMap(row_seq);
JSONObject json = new JSONObject();
json.putAll( map);
ProducerRecord<String, String> record = new ProducerRecord<String, String>(SPARK_CONF.get("topic.name"), json.toString());
producer.send(record);
我正在收到ClassCastException
答案 0 :(得分:0)
一旦您编写collectAsList();
,就不再使用Spark,而仅使用原始的Kafka Java API。
我的建议是使用Spark Structured Streaming Kafka Integration,您可以这样做
这里是一个示例,由于Kafka需要键和值,因此您需要形成一个至少包含两列的DataFrame。
// Write key-value data from a DataFrame to a specific Kafka topic specified in an option
data.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
.write
.format("kafka")
.option("kafka.bootstrap.servers", "host1:port1,host2:port2")
.option("topic", "topic_name")
.save()
就将数据导入JSON而言,collectToList()
也是错误的。不要将数据拉入单个节点。
您可以使用data.map()
将数据集从一种格式转换为另一种格式。
例如,您将Row映射到JSON格式的String中。
row -> "{\"f0\":" + row.get(0) + "}"