The window function TUMBLE requires the timecol is a time attribute type, but is TIMESTAMP(3)

博客内容讲述了在使用Apache Flink SQL进行窗口函数操作时遇到的时间属性类型错误。问题在于本地测试的表结构中,`event_time`缺少了ROWTIME标记和watermark定义。通过对比官网给出的表结构,发现缺少了`ROWTIME*`和watermark策略。在为`event_time`添加WATERMARK定义后,问题得以解决。代码示例展示了如何创建带有watermark的表结构。

在联系窗口函数的时候, 执行报错:

Exception in thread "main" org.apache.flink.table.api.ValidationException: SQL validation failed. The window function TUMBLE(TABLE table_name, DESCRIPTOR(timecol), datetime interval[, datetime interval]) requires the timecol is a time attribute type, but is TIMESTAMP(3).
 

看官网里的事件类型就是timestamp(3), 到底是哪里的问题呢?

首先尝试把表结构打印出来跟官网对比看看

-- 本地测试版的
+------------+--------------+------+-----+--------+-----------+
|       name |         type | null | key | extras | watermark |
+------------+--------------+------+-----+--------+-----------+
|     status |       STRING | true |     |        |           |
|         id |       BIGINT | true |     |        |           |
| event_time | TIMESTAMP(3) | true |     |        |           |
+------------+--------------+------+-----+--------+-----------+

官方给出的表结构:
Flink SQL> desc Bid;
+-------------+------------------------+------+-----+--------+---------------------
|        name |                   type | null | key | extras |                       watermark |
+-------------+------------------------+------+-----+--------+---------------------
|     bidtime | TIMESTAMP(3) *ROWTIME* | true |     |        | `bidtime` - INTERVAL '1' SECOND |
|       price |         DECIMAL(10, 2) | true |     |        |                                 |
|        item |                 STRING | true |     |        |                                 |
| supplier_id |                 STRING | true |     |        |                                 |
+-------------+------------------------+------+-----+--------+---------------------

发现event_time和官网给的bidtime差了一点, 在type里少了*ROWTIME*, 在watermark里, 本地测试版是空的, 而官网给的是有数据的, 因此可以断定是代码里未指定watermark, 在指定watermark后, 可以正常运行了

tEnv.executeSql(
                "CREATE TABLE KafkaSourceTable (\n"
                        + "  `status` STRING,\n"
                        + "  `id` BIGINT,\n"
                        + "  `event_time` TIMESTAMP(3),\n"
                        + "  WATERMARK FOR event_time AS event_time - INTERVAL '10' SECOND \n"
                        + ") WITH (\n"
                        + "  'connector' = 'kafka',\n"
                        + "  'topic' = 'flink',\n"
                        + "  'properties.bootstrap.servers' = 'localhost:9092',\n"
                        + "  'properties.group.id' = 'windowGroup',\n"
//                        + "  'scan.startup.mode' = 'latest-offset',\n"
                        + "  'format' = 'json'\n"
                        + ")"
        );

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值