hive使用split、cancat、collect_set、sort_array的一些示例及注意事项

2,790 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1、cancat、collect_set、sort_array

废话不多说,我们直接使用一个使用例子来进行说明他们的功能

例如:将periodical_code表中的p_year、p_year_stage两个字段连接成json字符串,然后分组收集到array里,最后再对array里的元素进行排序

select periodical_code,
sort_array(collect_set(
    concat(
        "{",
        concat(
            concat("\"", p_year, "\""),
            ":",
            concat("\"", p_year_stage, "\"")
        ),
        "}"
    )
)) as year_stage_set
from ods_medical group by periodical_code;

这边使用了hive中的3个函数,concat、collect_set、sort_array

1、cancat 可以将多个字符串连接

2、collect_set 可以将分组后的数据一条一条收集成一个array,而且会去除重复数据

3、sort_array 可以对一个array中的所有元素进行字典序排序

2、split

注意:我们经常会使用split对字符串做切分,但要注意一点,当原来的值为空值时,容易产生大小为1的空字符串数组[""],在我们查询时,它和空数组[]输出来是很相似的,但它的大小却是1,如果我们再根据array的size判断做一下操作时,很可能出现意想不到的错误。 例如:

one_cate_name
工程科技
哲学与人文科学;医药卫生科技
社会科学I
SELECT split(one_cate_name, ";") as split_name, size(split(one_cate_name, ";")) as num from table_name

得到: 在这里插入图片描述

为避免出现空字符串数组[""],可以切分时加条件

SELECT 
case when (one_cate_name="") then array() else split(one_cate_name, ";") end as split_name, 
size(split(one_cate_name, ";")) as num from table_name

在这里插入图片描述

hive空字符串数组和空数组

空字符串数组 :array(‘’) 空数组:array()

如果想查找表中的空字符串数组: 方法:可以使用查找数组中的第一个值是否为空字符串

select classify from table where classify[0]='';

想查找表中空数组: 方法:使用size判断数据大小是否为0

select classify from table where size(classify)=0;

总结:

concat:直接连接多个字符串列

concat_ws:使用给定的分隔符将多个输入字符串列连接成为一个。

collect_set:聚合函数,返回去除重复元素后的集合。

sort_array:属于集合函数,操作集合类型,对输入数组元素按升序或降序排序。空元素将按升序放在返回数组的开头,或按降序放在返回数组的末尾。