【问题标题】:KSQL SELECT code works, but CREATE TABLE `..` AS SELECT code returns error - io.confluent.ksql.util.KsqlStatementException: Column cannot be resolvedKSQL SELECT 代码有效,但 CREATE TABLE `..` AS SELECT 代码返回错误 - io.confluent.ksql.util.KsqlStatementException:无法解析列
【发布时间】:2019-11-23 04:03:28
【问题描述】:

我在 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)

【问题讨论】:

  • 最近修复了很多围绕引用标识符的错误,您似乎正在大量利用这些错误,但这些修复在最新版本中不可用(它们目前仅在 master 上) .您可以尝试创建您的流并仅对列名和源名称使用不带引号的值吗?
  • 感谢您的快速回复。我也试过不带引号(这是我的第一个选择)。但是在没有引号的情况下,即使是 SELECT 查询也不起作用。我试过这样: SELECT count() as attempt_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 ... cannot be resolve。当我用引号编写此查询时,SELECT 有效,但 CREATE TABLE 语句不起作用。

标签: confluent-platform ksqldb


【解决方案1】:

首先,我为我糟糕的英语道歉,如果我说的不够清楚,请不要犹豫,回复我,我会尝试以更好的方式解释我。

我不太了解 KSQL,但我会根据我创建像您的 TABLE 这样的 STREAMS 的经验来尽力帮助您。

1) 您可能知道,KSQL 将所有内容都以大写形式处理,除非您指定相反的内容。

2) KSQL 不支持 CREATE 查询中的 SELECT 中的双引号,事实上,KSQL 将忽略此字符并将您的字段作为大写列处理,因此,在返回给您的错误中,出现COMPUTER 而不是“计算机”。

此问题的解决方法是:

  • 首先,创建一个带有小写字段的空表:

    CREATE TABLE "incorrect_logins" ("attempts_count" INTEGER, "computer" VARCHAR, "row_time" INTEGER) WITH (KAFKA_TOPIC='topic_that_you_want', VALUE_FORMAT='avro')

(如果主题不存在,您必须先创建它)

  • 创建表后,您可以使用 SELECT 查询在表中插入数据:

    INSERT INTO "incorrect_logins" SELECT count() as "attempts_count", "computer", (WINDOWSTART() / 1000) as "row_time" FROM LOG_FLATTENED 窗户翻滚(大小 20 秒) WHERE “event_id” = 4625 按“计算机”分组 有计数()> 2;

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 2013-06-29
    • 2013-12-27
    • 2018-09-02
    • 2020-11-27
    相关资源
    最近更新 更多