计算列可以使用其它列的数据,计算出其所属列的数值。如果您的数据源表中没有TIMESTAMP类型的列,可以使用计算列方法从其它类型的字段进行转换。
计算列是虚拟列,并非实际存储在表中。计算列可以通过表达式、内置函数、或是自定义函数等方式,使用其它列的数据,计算出其所属列的数值。计算列在Flink SQL中可以像普通字段一样被使用。
目前Watermark的Event Time(也称为Rowtime)列只支持TIMESTAMP类型。Watermark只能定义在源表DDL中,如果您的源表中没有TIMESTAMP类型的列,可以使用计算列从其他类型的字段进行转换。
column_name AS computed_column_expression
Watermark的Rowtime必须是TIMESTAMP数据类型。当前实时计算支持毫秒级别的、在Unix时间戳里是13位TIMESTAMP数据类型。如果DataHub的TIME字段是微秒级别的(16位Unix时间戳),可以用计算列方法转换为13位的时间戳,如下所示。
CREATE TABLE test_stream( a INT, b BIGINT, `TIME` BIGINT, ts AS TO_TIMESTAMP(`TIME`/1000), --使用计算列方法,将16位时间戳转换为13位时间戳。 WATERMARK FOR ts AS WITHOFFSET(ts, 1000) ) WITH ( type = 'datahub', ... );
源表数据中的字段TIME
包含时间信息,为BIGINT类型。用计算列的功能将字段TIME
转换成13位时间戳(TIMESTAMP)类型字段ts
,并将ts
字段作为Watermark的Rowtime字段。