常见问题总集
Q:为什么Flink任务中有数据输入,没有脏数据产生,但是也没有输出?
A:①检查相应【实时采集】任务,是否勾选【格式转换】中【嵌套JSON平铺】。
②若勾选了格式转换,在相应Flink任务中进行源表JSON编写时,需将" . "改为" _ "。
Q:数据源配置中pay_time
为timestamp
类型,在GroupBy时选用DATE_FORMAT
函数时系统报错。错误日志中显示The main method caused an error: Incompatible types of expression and result type.
如何处理?
-- FlinkSQL代码
INSERT INTO dts_ds_merchant_target
SELECT CAST(1.2 as DECIMAL) as ID ,
CAST(2.3 as DECIMAL )as NUMB,
CAST(DATE_FORMAT(pay_time,'%Y-%m-%d') as VARCHAR) as DAYTIME
FROM dts_ds_merchant_source
GROUP BY DATE_FORMAT(pay_time,'%Y-%m-%d') , id
A:在SELECT中用户通过CAST()
函数将DATE_FORMAT()
返回值转换为VARCHAR
类型,但是在GROUPBY中没有进行转换,DATE_FORMAT()
默认返回STRING
类型。Flink SQL中仅有VARCHAR
类型,没有STRING
类型,所以出现报错情况。
解决方式:①通过CAST()
将DATE_FORMAT()
返回值转换成VARCHAR
类型;
INSERT INTO dts_ds_merchant_target
SELECT CAST(1.2 as DECIMAL) as ID ,
CAST(2.3 as DECIMAL )as NUMB,
CAST(DATE_FORMAT(pay_time,'%Y-%m-%d') as VARCHAR) as DAYTIME
FROM dts_ds_merchant_source
GROUP BY CAST(DATE_FORMAT(pay_time,'%Y-%m-%d') as VARCHAR), id
②GROUPBY时直接引用pay_time
字段,去掉DATE_FORMAT()
。
INSERT INTO dts_ds_merchant_target
SELECT CAST(1.2 as DECIMAL) as ID ,
CAST(2.3 as DECIMAL )as NUMB,
CAST(DATE_FORMAT(pay_time,'%Y-%m-%d') as VARCHAR) as DAYTIME
FROM dts_ds_merchant_source
GROUP BY pay_time, id
Q:错误日志提示The main method caused an error: side-table must be at the right of join operator
如何处理?
A:FlinkSQL仅支持流JOIN表,不支持表JOIN表操作;
Q:错误日志中显示Column 'rowtime' not found in any table; did you mean 'ROWTIME'?
该如何调整?
A:检查IDE语句,将其中的rowtime
修改为大写ROWTIME
即可。
Q:错误日志中显示The main method caused an error: field [totalsale] not found; input fields are: [totalSale, tms, tme]
或者The main method caused an error: Field name of query result and registered TableSink dts_ds_merchant_target do not match.
该如何调整?
A:语句提示现有totalsale
字段未找到/相应结果表字段不匹配。因为输入时大小写错误,导致flink进行数据消费时无法顺利写入Mysql相应字段中。需再次检查源表/结果表中字段名称和Flink处理语句中字段名称是否完全一致。
Q:程序运行正常,数据输入正常,但是无输出,只有脏数据怎么办?
A:检查【源表-字段/时间列】设置,确认选择时间字段声明的字段类型与其数据内容匹配。
YYYY-MM—DD HH:MM:SS
对应Timestamp
类型,YYYYMMDDHHMMSS
对应Bigint
类型。
目前流计算仅支持这两种时间字段类型。
Q:为何MYSQL结果表中滑步时长与开窗结束时长和设定内容有区别?
A:检查IDE语句中HOP相关语句,INTERVAL '30' SECOND
代表滑动步长,INTERVAL '5' MINUTE
代表开窗时长,若滑动步长小于开窗时长则会出现相应情况。
HOP_START(ROWTIME, INTERVAL '30' SECOND ,INTERVAL '5' MINUTE ) as hops
Q:为什么插入多次数据,仅在结果表中显示一次数据结果?
A:多次数据插入间隔短于会话间隔,Flink将其视作一个持续的流进行计算。可以通过以下两种方式进行调整:①重新设定一个更短的会话间隔;②等待超过会话间隔的时间再进行数据插入。
Q:错误日志显示Field types of query result and registered TableSink [表名] do not match.
如何处理?
A:语句提示当前输出字段中bill_date
字段与结果表中字段类型不符。重新回到FlinkSQL任务中确认结果表字段。
确定问题后可选用下列任一方式进行解决:
①对bill_date
字段通过 CAST()
函数转换为BIGINT
类型
原语句:a.dts_paytime AS bill_date,
转换后:CAST(a.dts_paytime as varchar) as bill_date,
②在数据库手动通过以下语句将bill_date
字段类型修改为BIGINT
类型
ALTER TABLE dts_ds_all_count_target MODIFY bill_date BIGINT
修改后重新保存提交,并重跑任务,即可解决问题。
Q:错误日志显示ON condition must contain all equal fields!!!
如何处理?
A:检查维表配置中`"主键"`设置,IDE代码中ON语句字段必须与维表中"`主键`"保持一致。
Q:运行信息中涉及的指标参数来源于哪里?
A:指标数据支持Prometheus和RestFulAPI两种获取方式。数据来源同一份,rest直接从flink里面获取。Promethues是将flink指标打到第三方系统,然后从第三方系统获取。
Q:在运行实时任务时,将总topic从1改为3,为什么只有一个分区能正常写入数据?
A:在原先Topic数量为1时,FlinkSQL任务提交会默认只向1个分区写入。此时增加分区时,由于任务处于运行过程中,仍默认原有分区写入,不会动态变化。因此,不要在运行过程中更改相关配置,如有更改,请选择时间点重跑。