Запрос GROUP BY
, выполняемый в потоке, должен производить обновления. Рассмотрим следующий пример:
SELECT user, COUNT(*) FROM clicks GROUP BY user;
Каждый раз, когда таблица clicks
получает новую строку, число соответствующих user
необходимо увеличивать и обновлять.
Когда вы конвертируете Table
в DataStream
, эти обновления должны быть закодированы в потоке. Flink использует ретракцию и добавляет сообщения для этого Позвонив по номеру tEnv.toRetractStream(table, Row.class)
, вы конвертируете Table
table
в DataStream<Tuple2<Boolean, Row>
. Флаг Boolean
важен и указывает, добавлен или убран Row
из таблицы результатов.
Учитывая приведенный выше пример запроса и входную таблицу clicks
как
user | ...
------------
Bob | ...
Liz | ...
Bob | ...
Вы получите следующий поток отвода
(+, (Bob, 1)) // add first result for Bob
(+, (Liz, 1)) // add first result for Liz
(-, (Bob, 1)) // remove outdated result for Bob
(+, (Bob, 2)) // add updated result for Bob
Вам нужно самостоятельно поддерживать результат, добавлять и удалять строки, как указано флагом Boolean
потока отвода.