簡體   English   中英

我可以在 KSQL 中從 Table 轉換為 Stream 嗎?

[英]Can I convert from Table to Stream in KSQL?

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

在 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 嗎?

正如您所確定的,問題在於您的表格是一個窗口表格,這意味着表格的鍵是窗口的,並且您無法使用非窗口鍵查找窗口表格。

就目前而言,您的表將為每 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;

由於競爭條件,幾乎可以肯定不會按照您的想法行事並且不會以您想要的方式工作。

目前尚不清楚您要實現的目標。 添加有關源數據和所需輸出的更多信息可能有助於人們為您提供解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM