GlobalKTable и KTable, оба представляют абстракцию журнала изменений, но разница в том, что KTable создается локально для каждого экземпляра приложения для каждого раздела, в то время как GlobalKTable заполняется полными данными из всех разделов в каждом экземпляре приложения. Он копирует все данные в каждом экземпляре приложения, что означает, что весь набор данных доступен для запросов в каждом экземпляре. Следовательно, он не требует совместного разбиения, и поиск возможен во всей таблице.
В следующем примере:
KStream<String, Long> left = ...; // // KStream has string type key
GlobalKTable<Integer, Double> right = ...; // GlobalKTable has integer type key
// Java 8+ example, using lambda expressions
KStream<String, String> joined = left.leftJoin(right,
(leftKey, leftValue) -> leftKey.length(), /* derive a (potentially) new key by which to lookup against the table */
(leftValue, rightValue) -> "left=" + leftValue + ", right=" + rightValue /* ValueJoiner */
);
Выберите ключ из левого потока, используя KeyValueMapper, который вы можете использовать для поиска в GlobalKTable, как указано ниже:
(leftKey, leftValue) -> leftKey.length(), /* select a (potentially) new key by which to lookup against the table */
GlobalKTable удобны для объединений, но дороги, поскольку требуют больше памяти по сравнению с KTables, а также увеличивают нагрузку на брокера сети и kafka.