FLINKSQL注意事项

目录

目录

1.CONCAT与CONCAT_WS

2.table.exec.hive.infer-source-parallelism.max  

3.使用hivecatalog时提示表找不到

4.trim()

5.TIMESTAMPDIFF(timepointunit, timepoint1, timepoint2)

6.判断是否为纯数字

7.flinksql提交yarn所使用container数量

8.Caused by: org.apache.flink.table.api.TableException: Temporal table join only support apply FOR SYSTEM_TIME AS OF on the right table

9.FLINKSQL mini-batch问题

10.Flink SQL默认字段类型推断问题

11.禁用hashjoin


1.CONCAT与CONCAT_WS

        CONCAT如果有null则返回null,CONCAT_WS会跳过null,两者都不会跳过空字符串

2.table.exec.hive.infer-source-parallelism.max  

       在使用hivecatalog时,可以通过设置上面参数限制读取并行度,否则会默认与hdfs的文件数相等,默认最大不超过1000,也可以通过这个参数决定最终在hdfs上生成的文件数量

table.exec.hive.fallback-mapred-reader=true;
set table.exec.hive.infer-source-parallelism.max=100;

3.使用hivecatalog时提示表找不到

        在表前加上default_catalog.default_database

4.trim()

        trim只会去除字符串的首尾空格

5.TIMESTAMPDIFF(timepointunit, timepoint1, timepoint2)

        时间差为后面-前面,也就是timepoint2-timepoint1

        如果要计算两个时间差是否满足否一条件不可用TIMESTAMPDIFF(HOUR, timepoint1, timepoint2)

        比如判断两个时间差是否超过48小时,

TIMESTAMPDIFF(HOUR, to_timestamp('20230205 090326', 'yyyyMMdd HHmmss'), to_timestamp('20230207 095006', 'yyyyMMdd HHmmss'))

得出的结果是48,但实际上是超过48小时的,所以要格外注意,所以如果要计算两个时间的时间差最好全都转成时间戳之后做减法,然后换算成对应的时间单位来判断

6.判断是否为纯数字

        hive的nvl('str' + 0, null) is not null会将nvl('1234 ' + 0, null) is not null判断为true

hive的str rlike '^\\d+$'会将'1234 ' rlike '^\\d+$'判断为false

flink的is_digit()会判断字符串为纯数字,is_digit('1234 ')判断为false

7.flinksql提交yarn所使用container数量

        一般情况只有一个数据源的时候,在yarn上使用的container数量为(p/ys)+ 1,当有多个数据源的时候需要看实际情况,比如下图的拓扑,-p 100 -ys 10的情况在实际使用contain为22个,具体计算为:100/10 + 100/10 + 1 + 1 = 22,两个1分别的含义为source实际并行度为1,另一个1是jobmanager

8.Caused by: org.apache.flink.table.api.TableException: Temporal table join only support apply FOR SYSTEM_TIME AS OF on the right table

        这是由于flinksql的source定义了PROCTIME(),而在join之前对source进行了where条件过滤

解决方案:

    1、需要过滤的数据不多时可以选择先join再过滤

    2、将source过滤后打到新的消息队列中再消费

9.FLINKSQL mini-batch问题

set table.exec.mini-batch.enabled =false; --关闭mini-batch:降低延迟 开启mini-batch:提高吞吐
如果数据要求低延迟且QPS不高则建议关闭mini-batch
如果数据延迟要求不高且QPS非常大则建议开启mini-batch,类似于spark的微批处理

10.Flink SQL默认字段类型推断问题

        例:if(column is not null, 'true', 'false') as column_name

        若column is not null = true,那么column_name = 'true'

        若column is not null = false,那么column_name = 'fals'

结论,这是因为flink自动做了类型推断,将column_name定义为char(4),所以会将false自动截断变成fals

        反之:if(column is not null, 'false', 'true') as column_name

        若column is not null = true,那么column_name = 'false'

        若column is not null = true,那么column_name = 'true '

        这样可能不好观察,贴个例子:    

   显然,if返回的是'true',但是为什么是5个字符呢?因为此时flink自动做了类型推断,将column_name定义为char(5),所以会将true自动补齐为'true '     

11.禁用hashjoin

业务中经常用到一个大表去关联维表的情况,当左表很大,右表维表很小的时候总会出现报错:

Caused by: java.lang.RuntimeException: Hash join exceeded maximum number of recursions, without reducing partitions enough to be memory resident. Probably cause: Too many duplicate keys.

此时只需要禁用hashjoin即可,

set table.exec.disabled-operators=HashJoin;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值