как найти расстояние между двумя лат-лонными парами, приходящими из двух разных потоков K SQL - PullRequest
0 голосов
/ 25 марта 2020

У меня есть K SQL имен потока данных «stream_car_1», который дает мне свою текущую позицию в виде потока лат-пары. У меня есть другой поток данных K SQL 'stream_car_2', который дает мне свою текущую позицию в виде потока лат-пары. Я должен каждый раз находить географическое расстояние между этими двумя машинами в режиме реального времени. Возможно ли это через K SQL? Если да, то как?

1 Ответ

1 голос
/ 25 марта 2020

Не зная вашей точной модели данных, трудно дать конкретный c ответ, но вот пример:

  1. Создание тестовых тем непосредственно в новом потоке:

    ksql> CREATE STREAM CAR1 (ID INT, LAT DOUBLE, LON DOUBLE) WITH (KAFKA_TOPIC='car1', VALUE_FORMAT='AVRO', PARTITIONS=1);
    
    Message
    ----------------
    Stream created
    ----------------
    ksql> CREATE STREAM CAR2 (ID INT, LAT DOUBLE, LON DOUBLE) WITH (KAFKA_TOPIC='car2', VALUE_FORMAT='AVRO', PARTITIONS=1);
    
    Message
    ----------------
    Stream created
    ----------------
    
  2. Добавить некоторые тестовые данные

    ksql> INSERT INTO CAR1 (ID, LAT, LON) VALUES (1,53.917719, -1.801575);
    ksql> INSERT INTO CAR2 (ID, LAT, LON) VALUES (1,53.910515, -1.788787);
    
  3. Запрос с начала топи c

    ksql> SET 'auto.offset.reset' = 'earliest';
    Successfully changed local property 'auto.offset.reset' to 'earliest'. Use the UNSET command to revert your change.
    
  4. Выполните объединение потокового потока и используйте функцию GEO_DISTANCE для вычисления:

    ksql> SELECT GEO_DISTANCE(C1.LAT, C1.LON, C2.LAT, C2.LON, 'KM') AS DISTANCE_BETWEEN_KM 
            FROM CAR1 C1 
                 LEFT JOIN CAR2 C2 
                   WITHIN 10 MINUTES 
                   ON C1.ID=C2.ID 
            EMIT CHANGES;
    +----------------------+
    |DISTANCE_BETWEEN_KM   |
    +----------------------+
    |1.1589376248164969    |
    
...