在联系窗口函数的时候, 执行报错:
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"
+ ")"
);


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

被折叠的 条评论
为什么被折叠?



