Apache Flink: лучший способ создать объединение "многие к одному" на динамическом столе?

У меня есть ресурс с часто добавляемыми / обновляемыми строками, который называется "Заказы", ​​и ресурс "Пользовательский профиль" с менее частыми (но часто важными) обновлениями. Я хочу выполнить непрерывный запрос на объединение этих двух ресурсов (в настоящее время логически хранящихся в виде динамических таблиц в Flink), чтобы при обновлении UserProfile таблица соединения генерировала DataStream с одним обновленным EnrichedOrder на Заказ, связанный с этим UserProfile. Цель состоит в том, чтобы проиндексировать эти обогащенные денормализованные данные для эффективного запроса в нисходящем приемнике данных.

Мой вопрос, каков наилучший способ создать это соединение? В частности, как я могу гарантировать, что все записи Порядка на стороне "многие" объединяются при обновлении UserProfile, сохраняя при этом производительность?

Поскольку произвольное внутреннее объединение без временного окна в Flink невозможно (предположительно по соображениям производительности), я считаю, что установка слишком большого временного окна также не рекомендуется.

Каковы рекомендуемые подходы для этого варианта использования?

1 ответ

Решение

В Flink 1.4.0 SQL не поддерживает внутренние объединения в потоках без временных границ, а API-интерфейс DataStream не обеспечивает приятного синтаксиса. Однако такое соединение можно изготовить вручную, используя CoProcessFunction,

Flink 1.5.0 будет поддерживать неограниченные объединения потоков в SQL. По умолчанию обе входные таблицы будут полностью сохранены в состоянии. Однако возможно настроить время хранения состояния, после которого состояние для неактивных ключей (неактивное = не обновлено в течение заданного интервала) очищается.

Поскольку поддержка SQL реализована поверх API DataStream, вы можете проверить реализацию неограниченного объединения SQL.

Другие вопросы по тегам