Spark Kafka Streaming-发送原始时间戳,而不是当前时间戳

时间:2018-11-09 10:31:36

标签: apache-spark apache-kafka

我正在使用Spark结构化流传输将记录发送到kafka主题。 kafka主题是使用配置-message.timestamp.type=CreateTime

创建的

这样做是为了使目标Kafka主题记录具有与原始记录相同的时间戳。

我的kafka流式代码:

kafkaRecords.selectExpr("CAST(key AS STRING)", "CAST(value AS BINARY)","CAST(timestamp AS TIMESTAMP)")
    .write
    .format("kafka")
    .option("kafka.bootstrap.servers","IP Of kafka")
    .option("topic",targetTopic)
    .option("kafka.max.in.flight.requests.per.connection", "1")
    .option("checkpointLocation",checkPointLocation)
    .save()

但是,这不会保留原始的时间戳,即2018/11/04,而是时间戳反映了最新的日期2018/11/9。

另一方面,只是为了确认kafka配置是否正常工作,当我显式创建一个带有时间戳的Kafka Producer和Producer记录并将其发送时,原始时间戳会保留下来。

如何在Kafka结构化流媒体中获得相同的行为。

1 个答案:

答案 0 :(得分:0)

主题的public interface HostRepository extends Neo4jRepository<Host, Long> { @Query("MATCH p=(parent:Host)<-[r:`28H`]-(child:Host) WHERE parent.Host_Name = \"pserver_01\" RETURN p, type(r)") Collection<Host> getAllHosts(); } 配置将意味着创建记录时(即获得记录的时间)。

不清楚您在哪里读取数据并查看时间戳,如果您正在运行生产者代码“今天”,那么这就是他们获得的时间,而不是之前。

如果您想要过去的时间戳,则实际上需要使用包含时间戳参数的构造函数使CreateTime包含该时间戳,但Spark不会公开它。

如果您在执行操作时仅将时间戳记放入有效负载值中,那么这就是您要进行分析的时间,可能不是ProducerRecord


如果您想将数据从一个主题准确地复制到另一个主题,Kafka使用MirrorMaker来完成。然后,您只需要配置文件,而无需编写和部署Spark代码