hql开发血泪史

1.length(null) 结果不是0是null,天真的我因为这个被坑苦了
还有SELECT if(length(null)<>12,'Y','N'), -- N if(length('')<>12,'Y','N') -- Y
这个也是个意想不到的错误
2.当一段sql报错,且不显示什么信息时,你就看看
表名.字段名,中间的.是不是写成了,
3.防止数据倾斜,这个真的太影响队列里的其他操作了,为避免数据倾斜,在2个地方需要额外注意,一个是表关联,一个是汇总数据。
表关联时,可以

 t1
 left join 
 t2
 on nvl(t1.line,concat('hive1',rand())) = nvl(t2.line,concat('hive1',rand()))

在汇总数据时

select
id,
sum(sum_num)
from 
(
select
id,
cast((rand() * 100) * 100 as int) as idx,
sum(num) sum_num
from 
table1
) a group by id

虽然多包一层,但可以避免数据倾斜
4.建表时,要加存储格式和压缩格式,要不然碰到大数据量运行,会吃光运行资源,而且存储资源也会占光

create table ta1 stored STORED AS ORC TBLPROPERTIES ('orc.compress' = 'SNAPPY')
select
...
from ta

5.去除字符串特殊字符。如:(空字符串、双引号、换行符、回车、tab键、‘null’、‘NULL’、‘N/A’、‘#N/A’、‘n/a’、‘#n/a’ )时,置为空

SELECT regexp_replace(line, '"|\\n|\\t|\\r|\\s+|null|NULL|N/A|#N/A|n/a|#n/a', '');

6.排序
row_number() over(partition by line1 order by line2 desc)
order by 后面跟的字段类型要格外注意,如果是数字类型倒没啥问题,但如果要是string类型,那么排的顺序会让人非常意外
在这里插入图片描述
如上,按金额排序,按说je为10的排第一,但是因为该字段是string类型,所以排序出现问题


版权声明:本文为qq_45292079原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。