KSQL-使用GEO_DISTANCE

时间:2018-09-11 00:33:39

标签: apache-kafka confluent ksql

我有一个kafka主题,该主题中的每条消息都有经度/纬度和事件时间戳。创建了一个引用主题的流,并希望使用geo_distance计算2点之间的距离。 例子

GpsDateTime            lat              lon
2016-11-30 22:38:36,    32.685757,  -96.735942
2016-11-30 22:39:07,    32.687347,  -96.732841
2016-11-30 22:39:37,    32.68805,   -96.729726 

我想在上述流上创建一个新流,并用距离来丰富它。

GpsDateTime            lat              lon          Distance
2016-11-30 22:38:36,    32.685757,  -96.735942        0
2016-11-30 22:39:07,    32.687347,  -96.732841        0.340
2016-11-30 22:39:37,    32.68805,   -96.729726        0.302

使用KSQL是否有可能取得预期的结果?还是在处理新消息时如何参考上一条消息?

1 个答案:

答案 0 :(得分:0)

首先,这些读数是否来自某种设备?如果是这样,您是否有一个唯一的ID(UUID)?我会将其放入您的信息流中,因此希望使用UUID, GpsDateTime, lat, lon

您将需要创建一个相当基本的Kafka Streams应用程序。在此应用程序中,您会将流中的最新读数存储到StoreBuilder中。然后,当收到来自Kafka的新消息时,您将检索此最新值,进行计算,然后将新的经纬度值存储到StoreBuilder中。

当然,我不清楚您是否只想让 ever 具有一个经纬度值,而所有后续值都是根据一读来计算的。或者,如果您想进行滚动计算,则总是在比较上一次读数与当前读数之间的距离。

无论如何,您可以在https://github.com/confluentinc/kafka-streams-examples/blob/5.0.0-post/src/test/java/io/confluent/examples/streams/StateStoresInTheDSLIntegrationTest.java

上实际看到此代码。

该示例是字数示例,但可以根据您的用例进行快速转换。

静态最终类WordCountTransformerSupplier(第78行)将成为您的LatLongDistanceComputation。

您将使用适当的类型(无论您存储的经度/纬度值)创建StoreBuilder(第154行)。

第165行是实际从流入的值流中读取项目的地方。

当然,您还需要编辑inputTopic和outputTopic(第66-67行)。