将Spark数据集转换为JSON并写入Kafka Producer

时间:2018-10-05 14:37:33

标签: java json apache-kafka apache-spark-sql kafka-producer-api

我想从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

1 个答案:

答案 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) + "}"