Пытаюсь читать из источника кафки. Я хочу извлечь метку времени из полученного сообщения, чтобы выполнить структурированную потоковую передачу искры. kafka (версия 0.10.0.0) искровая потоковая передача (версия 2.0.1)
Извлечь отметку времени из сообщений kafka в потоковой передаче искры?
Ответы (2)
Я бы предложил пару вещей:
Предположим, вы создаете поток с помощью последнего Kafka Streaming API (0.10 Кафка)
Например. вы используете зависимость:
"org.apache.spark" %% "spark-streaming-kafka-0-10" % 2.0.1
Затем вы создаете поток в соответствии с приведенными выше документами:
val kafkaParams = Map[String, Object]( "bootstrap.servers" -> "broker1:9092,broker2:9092", "key.deserializer" -> classOf[StringDeserializer], "value.deserializer" -> classOf[ByteArrayDeserializer], "group.id" -> "spark-streaming-test", "auto.offset.reset" -> "latest", "enable.auto.commit" -> (false: java.lang.Boolean)) val sparkConf = new SparkConf() // suppose you have 60 second window val ssc = new StreamingContext(sparkConf, Seconds(60)) ssc.checkpoint("checkpoint") val stream = KafkaUtils.createDirectStream(ssc, PreferConsistent, Subscribe[String, Array[Byte]](topics, kafkaParams))
Ваш поток будет DStream из ConsumerRecord[String,Array[Byte]], и вы можете получить метку времени и ключ-значение так же просто, как:
stream.map { record => (record.timestamp(), record.key(), record.value()) }
Надеюсь, это поможет.
spark.read
.format("kafka")
.option("kafka.bootstrap.servers", "your.server.com:9092")
.option("subscribe", "your-topic")
.load()
.select($"timestamp", $"value")
Поле «отметка времени» — это то, что вы ищете. Тип — java.sql.Timestamp. Убедитесь, что вы подключаетесь к серверу Kafka версии 0.10. В более ранних версиях временная метка отсутствует. Полный список описанных здесь полей — http://spark.apache.org/docs/latest/structured-streaming-kafka-integration.html#creating-a-kafka-source-for-batch-queries