簡體   English   中英

從 ksqlDB 中的 Stream 創建表中連接的 Rowkey

[英]Rowkey as Concatenated in Create Table from a Stream in ksqlDB

stream 是:

CREATE STREAM SENSORS_KSTREAM (sensorid INT,
  serialnumber VARCHAR,
  mfgdate VARCHAR,
  productname VARCHAR,
  customerid INT,
  locationid INT,
  macaddress VARCHAR,
  installationdate VARCHAR)
WITH (KAFKA_TOPIC='SENSORS_DETAILS', VALUE_FORMAT='AVRO', KEY='sensorid');

我用這個創建的表是:

CREATE TABLE SENSORS_KTABLE AS
SELECT sensorid, serialnumber, mfgdate, productname, customerid, locationid, macaddress, installationdate, COUNT(*) AS TOTAL 
FROM SENSORS_KSTREAM WINDOW TUMBLING (SIZE 1 MINUTES) 
GROUP BY sensorid, serialnumber, mfgdate, productname, customerid, locationid, macaddress, installationdate;

在此處輸入圖像描述

產生的ROWKEY不是我想要的。

我只想要SENSORID作為行鍵。

誰能幫我做到這一點。

提前致謝。

PS:我正在使用獨立的 Confluent 5.4.0。

ksqlDB 將表的主鍵存儲在底層 Kafka 消息的鍵中。 這對於確保重要的事情(例如相同鍵的一致分區分配和日志壓縮)至關重要。

ksqlDB 不支持復合鍵,盡管這是一個正在開發的功能。 因此,與此同時,當您按多列分組時,ksqlDB 會盡其所能並構建您遇到的復合鍵。 不是很好,但它實際上適用於許多用例。

您上面的語句是在主鍵中創建一個包含許多列的表 - 它們當前都被序列化為單個 STRING 值。

您要求僅在鍵中SENSORID ...但是您的 GROUP BY 子句使所有列在鍵的一部分之后。

在我看來,您有一個包含傳感器更新值的 stream 的主題。 在這種情況下,我建議研究兩個選項:

  1. 如果輸入主題中的每一行都包含每個傳感器的所有數據,那么為什么不將其作為 TABLE 而不是 STREAM 導入:
CREATE TABLE SENSORS_KSTREAM (sensorid INT,
  serialnumber VARCHAR,
  mfgdate VARCHAR,
  productname VARCHAR,
  customerid INT,
  locationid INT,
  macaddress VARCHAR,
  installationdate VARCHAR)
WITH (KAFKA_TOPIC='SENSORS_DETAILS', VALUE_FORMAT='AVRO', KEY='sensorid');
  1. 或者,也許LATEST_BY_OFFSET可能用於捕獲每列的最新值:
CREATE TABLE SENSORS_KTABLE AS
SELECT sensorid, LATEST_BY_OFFSET(serialnumber), LATEST_BY_OFFSET(mfgdate), LATEST_BY_OFFSET(productname), LATEST_BY_OFFSET(customerid), LATEST_BY_OFFSET(locationid), LATEST_BY_OFFSET(macaddress), LATEST_BY_OFFSET(installationdate) 
FROM SENSORS_KSTREAM WINDOW TUMBLING (SIZE 1 MINUTES) 
GROUP BY sensorid;

LAST_BY_OFFSET 僅在幾個版本前引入,因此您可能需要更新。

希望這兩個選項將幫助您到達您需要的地方。

暫無
暫無

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

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