Is it possible to ReKey a GlobalKTable?
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.
In Apache Kafka Streams, a GlobalKTable is a fundamental abstraction that represents a fully replicated, read-only table. The data in a GlobalKTable is usually sourced from Kafka topics and global in the sense that every data record from a source topic is available at each instance of an application, unlike KTable that only maintains data which is local to a specific partition.
Understanding GlobalKTable
Before diving into whether a GlobalKTable can be rekeyed, it's important to understand its properties and use cases. Unlike a KTable, which represents a changelog stream from Kafka topics and maps directly to a particular Kafka partition, a GlobalKTable loads the entire dataset from a topic into each application's local state. This allows a GlobalKTable to be joined with a KStream without regard to data co-location.
Can You ReKey a GlobalKTable?
Simply put, rekeying, in the context of Kafka Streams, refers to changing the key that is associated with a particular record as it passes through the streaming topology. Now, can we rekey a GlobalKTable? The straightforward answer is, no, directly rekeying a GlobalKTable is not supported in Kafka Streams.
Reasons for the Limitation
- Global Consistency: Since
GlobalKTableis meant to represent consistent and static viewpoints of a dataset across all instances, altering keys might lead to inconsistencies across different application instances. - Read-Only Nature:
GlobalKTables are inherently read-only. They are not designed to modify the data they have loaded but to provide a global, consistent view of the data to all stream processors.
Workarounds for Rekeying Needs
While you cannot directly rekey a GlobalKTable, you can manipulate data upstream before it is loaded into the GlobalKTable or choose to handle any modifications in the application logic post-join or processing. Here are a couple of strategies:
- Pre-Processing During Ingestion: Modify the key of records as they are produced to the Kafka topic that backs the
GlobalKTable. This way, theGlobalKTableis built with the desired key structure from the outset. - Post-Join Transformation: If you need to join a
KStream(which can be rekeyed at any point) with aGlobalKTableand then wish to modify keys, perform the rekey operation on theKStreameither before or after the join, based on your business logic. This would mean handling rekeying in the processing logic rather than trying to alter theGlobalKTable.
Example of Handling Rekey with KStream
Here's a simple example where we rekey data after joining a KStream and a GlobalKTable:
Summary Table
Here's a summary of key points about GlobalKTable and rekeying:
| Feature | Description |
| Global Data | Data in GlobalKTable is available globally across all application instances. |
| Rekeying Directly | Not supported due to the read-only and globally consistent nature of GlobalKTable. |
| Workarounds | Rekeying can be managed either upstream (data production) or downstream (post-join processing). |
Conclusion
While directly rekeying a GlobalKTable is not supported in Kafka Streams, understanding how to manipulate data streams either before ingestion into the GlobalKTable or after joining can provide flexible solutions to meet your application needs. Leveraging Apache Kafka's powerful streaming API, particularly the robust capabilities of KStream, allows overcoming this limitation effectively.
Related reading
- Is it possible to replicate kafka topics without alias prefix with MirrorMaker2
- Is it possible to reset offsets to a topic for a kafka consumer group in a kafka connector?
- Is it possible to run more than one rabbitmq instance on one machine?
- Is it possible to skip delegating a celery task if the params and the task name is already queued in the server?
- Is it possible to transfer files using Kafka?
- Is it possible to use async/await for Publishing a message to RabbitMQ?
- Is it possible to view RabbitMQ message contents directly from the command line?
- Is kafka a good fit for a small scale microservices environment, or should I look for lightweight alternatives

System Design Fundamentals
Build a strong foundation in designing scalable, reliable distributed systems.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.