--------20190905更新-------
沙雕了,可以用 JSONKeyValueDeserializationSchema,接收ObjectNode的数据,如果有key,会放在ObjectNode中
if (record.key() != null) { node.set("key", mapper.readValue(record.key(), JsonNode.class)); } if (record.value() != null) { node.set("value", mapper.readValue(record.value(), JsonNode.class)); } if (includeMetadata) { node.putObject("metadata") .put("offset", record.offset()) .put("topic", record.topic()) .put("partition", record.partition()); }
-------------------
Flink 的 FlinkKafkaConsumer、FlinkKafkaProducer,在消费、生成kafka 数据的时候,不能指定key,又时候,我们又需要这个key。
val kafkaSource = new FlinkKafkaConsumer[ObjectNode]("kafka_demo", new JsonNodeDeserializationSchema(), Common.getProp) val sink = new FlinkKafkaProducer[String]("kafka_demo_out", new SimpleStringSchema(), Common.getProp) sink.setWriteTimestampToKafka(true) env.addSource(kafkaSource) .map(node => { node.put("token", System.currentTimeMillis()) node.toString }) .addSink(sink)
下面通过flink 的自定source、sink 实现,消费、生成kafka 数据的时候,获取数据的key ,和输出不同key的数据
思路: 使用kafka 原生的api,KafkaConsuemr和KafkaProducer 消费、生产kafka的数据,就可以获取到key值
kafka 生产者:
object KafkaKeyMaker { val topic = "kafka_key" def main(args: Array[String]): Unit =