KSQL SELECT代码有效,但是CREATE TABLE`..` AS SELECT代码返回错误-io.confluent.ksql.util.KsqlStatementException:无法解析列

时间:2019-11-07 16:53:17

标签: confluent ksql

在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

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;

希望对您有帮助!