Kafka Connect JDBC接收器-存储来自KSQL的聚合数据

时间:2019-05-16 21:45:20

标签: apache-kafka apache-kafka-connect ksql

我正在尝试使用kafka connect将ksql查询(窗口表)的结果存储到数据库中。

我现在想做的是(使用kafka jdbc connect)将它们存储在数据库中,但是行被更新(因为kafka表当前正在更新值),而不仅仅是消息流;

因此,尽管消息将是这样的:

1558042958867 | User_9 : Window{start=1558042920000 end=-} | User_9 | 20
1558042961348 | User_9 : Window{start=1558042920000 end=-} | User_9 | 21
1558042962141 | User_9 : Window{start=1558042920000 end=-} | User_9 | 22
1558042965552 | User_9 : Window{start=1558042920000 end=-} | User_9 | 23
1558042968275 | User_9 : Window{start=1558042920000 end=-} | User_9 | 24
1558042969668 | User_9 : Window{start=1558042920000 end=-} | User_9 | 25
1558042973915 | User_9 : Window{start=1558042920000 end=-} | User_9 | 26
1558042976235 | User_9 : Window{start=1558042920000 end=-} | User_9 | 27
1558042980197 | User_9 : Window{start=1558042980000 end=-} | User_9 | 1
1558042980635 | User_9 : Window{start=1558042980000 end=-} | User_9 | 2
1558042982969 | User_9 : Window{start=1558042980000 end=-} | User_9 | 3
1558042983511 | User_9 : Window{start=1558042980000 end=-} | User_9 | 4
1558042986352 | User_9 : Window{start=1558042980000 end=-} | User_9 | 5
1558042986863 | User_9 : Window{start=1558042980000 end=-} | User_9 | 6
1558042988328 | User_9 : Window{start=1558042980000 end=-} | User_9 | 7
1558042988863 | User_9 : Window{start=1558042980000 end=-} | User_9 | 8

在数据库中,我只想拥有

User_9 : Window{start=1558042920000 end=-} | User_9 | 27
User_9 : Window{start=1558042980000 end=-} | User_9 | 8

类似这样的事情。 在ksql / kafka-connect周围有什么魔术可以让我做到这一点?

为澄清起见-最后一个字段是该总计,用于计算窗口时间到目前为止x发生了多少次。

我以为我可以将window start + key作为数据库密钥并对其进行更新,但是我不确定如何在KSQL中实现。也许使用Kafka Streams可以做到吗?

@编辑:

好,所以我设法通过将这些属性添加到接收器配置中来做到这一点:

pk.mode=record_key
pk.fields=rowkey
insert.mode=upsert

现在行已更新,但窗口数据有些混乱,看起来像这样:

TOTAL   USERID  rowkey
32      User_9  User_9j�
31      User_9  User_9jı�`
22      User_9  User_9jIJ��
1       User_9  User_9jij� 

所以窗口在那里,但是二进制编码?不知道那里发生了什么。 我仍然需要以某种可读的格式获取日期

1 个答案:

答案 0 :(得分:0)

好的,找到了解决方案。 因此,首先,我需要在查询中创建window_start / window_end字段,如下所示:

SELECT [...], WINDOWSTART() AS window_start, WINDOWEND() AS window_end, [...]

此后,我不得不添加这些参数以使其沉没:

pk.mode=record_value
pk.fields=[...],WINDOW_START
insert.mode=upsert

可行。