我可以在KSQL中从表转换为流吗?

时间:2020-01-13 06:26:47

标签: apache-kafka streaming ksqldb

我正在使用KSQL在kafka中工作。我想在5分钟内用不同的DEV_NAME(ROWKEY)查找最后一行。因此,我创建了流和聚合表以供进一步加入。

在KSQL下面,我创建了用于在5分钟内找到不同DEV_NAME的最后一行的表

CREATE TABLE TESTING_TABLE  AS
SELECT  ROWKEY AS DEV_NAME, max(ROWTIME) as LAST_TIME 
    FROM TESTING_STREAM WINDOW TUMBLING (SIZE 5 MINUTES)
    GROUP BY ROWKEY;

然后,我想在一起:

CREATE STREAM TESTING_S_2 AS 
  SELECT *
    FROM TESTING_S  S
        INNER JOIN TESTING_T T
        ON    S.ROWKEY = T.ROWKEY
    WHERE  
    S.ROWTIME = T.LAST_TIME;

但是,它发生了错误:

Caused by: org.apache.kafka.streams.errors.StreamsException: A serializer (org.apache.kafka.streams.kstream.TimeWindowedSerializer) is not compatible to the actual key type (key type: org.apache.kafka.connect.data.Struct). Change the default Serdes in StreamConfig or provide correct Serdes via method parameters.

应该是WINDOW TUMBLING函数更改了我的ROWKEY样式

(e.g. DEV_NAME_11508 -> DEV_NAME_11508 : Window{start=157888092000 end=-}       

因此,在不设置Serdes的情况下,我可以从表转换为流并设置PARTITION BY DEV_NAME吗?

1 个答案:

答案 0 :(得分:0)

正如您所确定的那样,问题在于您的表是一个带窗口的表,这意味着该表的键是带窗口的,并且您无法使用非带窗口的键来查找带窗口的表。

按现状显示,您的表格将为每5分钟窗口的每个ROWKEY生成一个唯一的行。但是,您似乎只在乎最近的窗口而已。可能是您不需要表格中的窗口,例如

CREATE TABLE TESTING_TABLE AS 
   SELECT 
     ROWKEY AS DEV_NAME, 
     max(ROWTIME) as LAST_TIME  
   FROM TESTING_STREAM 
   WHERE ROWTIME > (UNIX_TIMESTAMP() - 300000) 
   GROUP BY ROWKEY;

将跟踪每个键的最大时间戳,而忽略超过5分钟的任何时间戳。 (当然,此检查仅在收到事件时进行,5分钟后不会删除该行)。

此外,此联接:

CREATE STREAM TESTING_S_2 AS 
  SELECT *
    FROM TESTING_S  S
        INNER JOIN TESTING_T T
        ON    S.ROWKEY = T.ROWKEY
    WHERE  
    S.ROWTIME = T.LAST_TIME;

几乎可以肯定的是,由于比赛条件的原因,这并没有按照您的想法去做,也无法按照您想要的方式进行。

目前尚不清楚您要达到的目标。添加有关您的源数据和所需输出的更多信息可能会帮助人们为您提供解决方案。