我很好奇为什么非键联接与 GlobalKTtable 和 KTable-KTable 一起使用?尽管我理解为什么我们不需要为globalKTable (BroadCast Join)
进行共分区,但是我不明白是什么使非密钥连接能够使用它?任何人都可以粗略了解发生的事情吗?
答案 0 :(得分:1)
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代理的负载。