目录
目录
2.table.exec.hive.infer-source-parallelism.max
5.TIMESTAMPDIFF(timepointunit, timepoint1, timepoint2)
7.flinksql提交yarn所使用container数量
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;