[英]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 的主題。 在這種情況下,我建議研究兩個選項:
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');
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.