GlobalTable与Ktable-Ktable Join进行非关键联接?

时间:2019-07-09 07:34:48

标签: apache-kafka-streams ksql

我很好奇为什么非键联接与 GlobalKTtable KTable-KTable 一起使用?尽管我理解为什么我们不需要为globalKTable (BroadCast Join)进行共分区,但是我不明白是什么使非密钥连接能够使用它?任何人都可以粗略了解发生的事情吗?

1 个答案:

答案 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代理的负载。