在KSQL中创建表或流时遇到了问题。
我已经按照官方示例中的说明进行了所有操作,但我不明白为什么我的代码无法正常工作。 来自https://docs.confluent.io/current/ksql/docs/tutorials/examples.html#joining的示例:
CREATE TABLE pageviews_per_region_per_session AS
SELECT regionid,
windowStart(),
windowEnd(),
count(*)
FROM pageviews_enriched
WINDOW SESSION (60 SECONDS)
GROUP BY regionid;
现在输入我的代码:
我尝试在命令舞会中运行select,效果很好:
SELECT count(*) as attempts_count, "computer", (WINDOWSTART() / 1000) as row_time
FROM LOG_FLATTENED
WINDOW TUMBLING (SIZE 20 SECONDS)
WHERE "event_id" = 4625
GROUP BY "computer"
HAVING count(*) > 2;
但是当我尝试基于此选择创建表时(来自ksql命令行工具):
CREATE TABLE `incorrect_logins` AS
SELECT count(*) as attempts_count, "computer", (WINDOWSTART() / 1000) as row_time
FROM LOG_FLATTENED
WINDOW TUMBLING (SIZE 20 SECONDS)
WHERE "event_id" = 4625
GROUP BY "computer"
HAVING count(*) > 2;
我遇到了错误-io.confluent.ksql.util.KsqlStatementException: Column COMPUTER cannot be resolved.
,但是此列存在并且选择时没有create table
语句就可以正常工作。
我正在使用最新的稳定KSQL映像(confluentinc/cp-ksql-server:5.3.1
)
答案 0 :(得分:0)
首先,我为我的英语不好而道歉,如果我说的话不够清楚,请立即回复我,并尝试以更好的方式向我解释。
我不太了解KSQL,但是根据我创建TABLE之类的STREAMS的经验,我会尽力帮助您。
1)您可能知道,除非指定相反的内容,否则KSQL会将所有内容作为UpperCase处理。
2)KSQL在CREATE查询中的SELECT中不支持双引号,实际上,KSQL会忽略此字符并将其作为UpperCase列处理您的字段,因此,在返回给您的错误中, 计算机,而不是“计算机”。
此问题的解决方法是:
首先,使用lowerCase字段创建一个空表:
使用(KAFKA_TOPIC ='topic_that_you_want',VALUE_FORMAT ='avro')创建表“ incorrect_logins”(“ attempts_count” INTEGER,“计算机” VARCHAR,“ row_time” INTEGER)
(如果该主题不存在,则必须先创建该主题)
一旦创建了表,就可以使用SELECT查询在表中插入数据:
将INERT INTO“ incorrect_logins” SELECT count()转换为“ attempts_count”,“ computer”,将(WINDOWSTART()/ 1000)转换为“ row_time” 来自LOG_FLATTENED 窗户晃动(大小20秒) 其中“ event_id” = 4625 按“计算机”分组 HAVING count()> 2;
希望对您有帮助!