hive和spark在分组时用到字符串截取函数substr和substring时的区别

时间:2024-04-13 14:46:53

这篇文章主要以日期表为例子,讨论hive和spark在处理分组语句时的异同点,以及substr和substring函数的区别。

我们在写hive sql做数据查询时,我们经常会遇到分组的字段需要截取字符串或者处理一下,这时候我们会有一个疑问,我们是要用这个截取字符串的别名做分组呢?还是用截取串的那个函数做分组呢?
下面我有以一个日期表为例,来讨论一下这个问题。
表名: d_cod_dt
表中数据:
hive和spark在分组时用到字符串截取函数substr和substring时的区别
我这里写了6个sql语句,分别用mr引擎和spark引擎做测试。
(1)
select substring(dt_id,1,6) ,count(1)
from hdp_bic_bd_dwd.d_cod_dt
where mth_id = ‘201911’
group by substring(dt_id,1,6)
(2)
select substr(dt_id,1,6) ,count(1)
from hdp_bic_bd_dwd.d_cod_dt
where mth_id = ‘201911’
group by substr(dt_id,1,6)
(3)
select substring(dt_id,1,6) as pt_mt ,count(1)
from hdp_bic_bd_dwd.d_cod_dt
where mth_id = ‘201911’
group by substring(dt_id,1,6)
(4)
select substring(dt_id,1,6) as pt_mt ,count(1)
from hdp_bic_bd_dwd.d_cod_dt
where mth_id = ‘201911’
group by pt_mt
(5)
select substr(dt_id,1,6) as pt_mt ,count(1)
from hdp_bic_bd_dwd.d_cod_dt
where mth_id = ‘201911’
group by substr(dt_id,1,6)
(6)
select substr(dt_id,1,6) as pt_mt ,count(1)
from hdp_bic_bd_dwd.d_cod_dt
where mth_id = ‘201911’
group by pt_mt

细心的同学肯定发现了这6个语句的区别了,那么实验的结果是什么呢?
这里列出了实验结果的表格
hive和spark在分组时用到字符串截取函数substr和substring时的区别
运行成功的结果:
hive和spark在分组时用到字符串截取函数substr和substring时的区别
看到结果,我们可以来对比一下
hive和spark在分组时用到字符串截取函数substr和substring时的区别
hive和spark在分组时用到字符串截取函数substr和substring时的区别
通过上面的结果,我们可以总结出几个结论:
(1)在用mr、spark计算引擎的时候,尽量用substring而不是substr,网上说这两个函数是一样的效果,可是通过实验我们看到,spark用substr会有意想不到的问题,还是substring靠谱些。
(2)在做字符串截取,并且这个字符串截取会出现在分组中的时候,尽量不要用别名,不然可能会有问题;所以说,不用别名更靠谱些。
ps:测试结果与hive版本、spark版本有关,我也不清楚我用的环境是什么版本的。。。