You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@kafka.apache.org by "Bruno Cadonna (Jira)" <ji...@apache.org> on 2020/04/24 17:11:00 UTC
[jira] [Created] (KAFKA-9916) Materialize Table-Table Join Result
to Avoid Performing Same Join Twice
Bruno Cadonna created KAFKA-9916:
------------------------------------
Summary: Materialize Table-Table Join Result to Avoid Performing Same Join Twice
Key: KAFKA-9916
URL: https://issues.apache.org/jira/browse/KAFKA-9916
Project: Kafka
Issue Type: Improvement
Components: streams
Affects Versions: 2.5.0
Reporter: Bruno Cadonna
If a table-table join processor performs a join and the join needs to forward downstream the old join result (e.g. due to an aggregation operation downstream), it performs the same join (i.e. calls the {{ValueJoiner}}) twice.
Given a left value {{L1}}, a right value {{R1}}, and a new right value {{R2}} with the same keys and input into the join operation in this order, the join processor at some point will join {{L1}} with {{R1}}. When the new right value {{R2}} triggers the join, it will join {{L1}} with {{R2}} and again {{L1}} with {{R1}}.
We could avoid calling the {{ValueJoiner}} twice by materializing the join result. We would trade a call to the {{ValueJoiner}} with a lookup into a state store. Depending on the logic in the {{ValueJoiner}} this may or may not improve the performance. However, calling the {{ValueJoiner}} once will only access the input values of the {{ValueJoiner}} once, which avoids the need to copy the input values each time the {{ValueJoiner}} is called. For example, consider the following {{ValueJoiner}}:
{code:java}
private ComplexValue eventFeesJoin(ComplexValue leftValue, Long rightValue) {
leftValue.setSomeValue(rightValue);
return leftValue;
}
{code}
With this {{ValueJoiner}}, {{setSomeValue(rightValue)}} will be called twice when {{R2}} trigger the join, the first time with {{R2}} and the second time with {{R1}}. That means, {{R2}} will be overwritten by {{R1}}, which is probably not what the users want. To get the correct result, the {{ValueJoiner}} should be implemented as follows:
{code:java}
private ComplexValue eventFeesJoin(ComplexValue leftValue, Long rightValue) {
ComplexValue copy = copy(leftValue);
copy.setSomeValue(rightValue);
return copy;
}
{code}
Copying values during joins could be avoided if the join result were materialized.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)