代码之家  ›  专栏  ›  技术社区  ›  xmar

Kafka Streams:不重新分区共分区数据的映射

  •  0
  • xmar  · 技术社区  · 8 年前

    我有一个来自底层主题的KStream,其类型为[K3,V]K3是由三个字段组成的键,即K3(a,b,c)然而,主题仅由键的字段子集(即K2(a,b))划分。

    现在,我想创建一个KTable来连接和使用我的PAPI处理器我希望这个k能加起来k2(a,b)。聚合只是将值收集到一个集合中。

    要做到这一点,我将不得不使用“地图”功能转换我的关键从k3到k2。这将(尝试)通过创建新的重新分区主题来重新分区数据(尽管实际数据将保留在相同的分区中,因为它也将使用K2作为分区键),请参见下面拓扑中的“测试customerStoreName重新分区”。

      Sub-topology: 0
    Source: KSTREAM-SOURCE-0000000000 (topics: [test-customerz])
      --> KSTREAM-MAP-0000000003
    Processor: KSTREAM-MAP-0000000003 (stores: [])
      --> KSTREAM-FILTER-0000000006
      <-- KSTREAM-SOURCE-0000000000
    Processor: KSTREAM-FILTER-0000000006 (stores: [])
      --> KSTREAM-SINK-0000000005
      <-- KSTREAM-MAP-0000000003
    Sink: KSTREAM-SINK-0000000005 (topic: test-customerStoreName-repartition)
      <-- KSTREAM-FILTER-0000000006
    

    有没有一种方法可以在不必通过映射重新分区的情况下进行聚合?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Matthias J. Sax    8 年前

    使用dsl,这是不可能的,因为您不能告诉库不需要重新分区。

    您需要直接使用处理器API,因为处理器API不进行任何自动重新分区。

    你也可以“破解”一些东西:在 map() 返回的 KStream 可以铸造成 KStreamImpl 键入,然后通过反射设置内部标志 repartitionRequired 到 false 是的。但这是一个黑客!