The key type returned by both KeyValueMappers (in the current trunk
version, that type is named `R`) would need to be the same for this to work.


On Wed, Dec 7, 2016 at 4:46 PM, Damian Guy <damian....@gmail.com> wrote:

> Michael,
>
> We can only support outerJoin if both tables are keyed the same way. Lets
> say for example you can map both ways, however, the key for each table is
> of a different type. So t1 is long and t2 is string - what is the key type
> of the resulting GlobalKTable? So when you subsequently join to this table,
> and do a lookup on it, which key are you using?
>
> Thanks,
> Damian
>
> On Wed, 7 Dec 2016 at 14:31 Michael Noll <mich...@confluent.io> wrote:
>
> > Damian,
> >
> > yes, that makes sense.
> >
> > But I am still wondering:  In your example, there's no prior knowledge
> "can
> > I map from t1->t2" that Streams can leverage for joining t1 and t2 other
> > than blindly relying on the user to provide an appropriate KeyValueMapper
> > for K1/V1 of t1 -> K2/V2 of t2.  In other words, if we allow the user to
> > provide a KeyValueMapper from t1->t2 (Streams does not know at compile
> time
> > whether this mapping will actually work), then we can also allow the user
> > to provide a corresponding "reverse" mapper from t2->t1.  That is, we
> could
> > say that an outer join between two global tables IS supported, but if and
> > only if the user provides two KeyValueMappers, one for t1->t2 and one for
> > t2->t1.
> >
> > The left join t1->t2 (which is supported in the KIP), in general, works
> > only because of the existence of the user-provided KeyValueMapper from
> > t1->t2.  The outer join, as you point out, cannot satisfied as easily
> > because Streams must know two mappers, t1->t2 plus t2->t1 -- otherwise
> the
> > outer join won't work.
> >
> >
> >
> >
> >
> > On Wed, Dec 7, 2016 at 3:04 PM, Damian Guy <damian....@gmail.com> wrote:
> >
> > > Hi Michael,
> > >
> > > Sure. Say we have 2 input topics t1 & t2 below:
> > > t1{
> > >  int key;
> > >  string t2_id;
> > >  ...
> > > }
> > >
> > > t2 {
> > >   string key;
> > >   ..
> > > }
> > > If we create global tables out of these we'd get:
> > > GlobalKTable<Integer, ?> t1;
> > > GlobalKTable<String, ?> t2;
> > >
> > > So the join can only go in 1 direction, i.e, from t1 -> t2 as in order
> to
> > > perform the join we need to use a KeyValueMapper to extract the t2 key
> > from
> > > the t1 value.
> > >
> > > Does that make sense?
> > >
> > > Thanks,
> > > Damian
> > >
> > > On Wed, 7 Dec 2016 at 10:44 Michael Noll <mich...@confluent.io> wrote:
> > >
> > > > > There is no outer-join for GlobalKTables as the tables may be keyed
> > > > > differently. So you need to use the key from the left side of the
> > join
> > > > > along with the KeyValueMapper to resolve the right side of the
> join.
> > > This
> > > > > wont work the other way around.
> > > >
> > > > Care to elaborate why it won't work the other way around?  If, for
> > > example,
> > > > we swapped the call from leftTable.join(rightTable) to
> > > > rightTable.join(leftTable), that join would work, too.  Perhaps I am
> > > > missing something though. :-)
> > > >
> > > >
> > > >
> > > >
> > > > On Wed, Dec 7, 2016 at 10:39 AM, Damian Guy <damian....@gmail.com>
> > > wrote:
> > > >
> > > > > Hi Matthias,
> > > > >
> > > > > Thanks for the feedback.
> > > > >
> > > > > There is no outer-join for GlobalKTables as the tables may be keyed
> > > > > differently. So you need to use the key from the left side of the
> > join
> > > > > along with the KeyValueMapper to resolve the right side of the
> join.
> > > This
> > > > > wont work the other way around.
> > > > >
> > > > > On the bootstrapping concern. If the application is failing before
> > > > > bootstrapping finishes, the problem is likely to be related to a
> > > terminal
> > > > > exception, i.e., running out of disk space, corrupt state stores
> etc.
> > > In
> > > > > these cases, we wouldn't want the application to continue. So i
> think
> > > > this
> > > > > is ok.
> > > > >
> > > > > Thanks,
> > > > > Damian
> > > > >
> > > > > On Tue, 6 Dec 2016 at 21:56 Matthias J. Sax <matth...@confluent.io
> >
> > > > wrote:
> > > > >
> > > > > > Thanks for the KIP Damian. Very nice motivating example!
> > > > > >
> > > > > > A few comments:
> > > > > >
> > > > > >  - why is there no outer-join for GlobalKTables
> > > > > >  - on bootstrapping GlobalKTable, could it happen that this never
> > > > > > finishes if the application fails before bootstrapping finishes
> and
> > > new
> > > > > > data gets written at the same time? Do we need to guard against
> > this
> > > > > > (seems to be a very rare corner case, so maybe not required)?
> > > > > >
> > > > > >
> > > > > > -Matthias
> > > > > >
> > > > > >
> > > > > > On 12/6/16 2:09 AM, Damian Guy wrote:
> > > > > > > Hi all,
> > > > > > >
> > > > > > > I would like to start the discussion on KIP-99:
> > > > > > >
> > > > > > https://cwiki.apache.org/confluence/pages/viewpage.
> > > > > action?pageId=67633649
> > > > > > >
> > > > > > > Looking forward to your feedback.
> > > > > > >
> > > > > > > Thanks,
> > > > > > > Damian
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> >
> >
> > --
> > *Michael G. Noll*
> > Product Manager | Confluent
> > +1 650 453 5860 <(650)%20453-5860> | @miguno <https://twitter.com/miguno
> >
> > Follow us: Twitter <https://twitter.com/ConfluentInc> | Blog
> > <http://www.confluent.io/blog>
> >
>

Reply via email to