【Hive---10】单列函数『字符串函数 | 日期函数 | 数学函数 | 集合函数 | 条件函数 | 数据脱敏函数 | 其他函数(反射、加密解密、等等)』

前言:查看函数详细描述的SQL:

describe function extended func_name;

1. 内置函数(Built-in Functions)

官方文档地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

1.1 字符串函数

在这里插入图片描述
下面重点解释上面红色函数:

  1. 字符串拼接

    1. 直接拼接:concat(string + | array(string) +)

      select concat("angela","baby"); -- 输出:"angelababy"
      -- 注意:只要有一个元素为null,则返回null
      select concat("angela","baby", null); -- 输出:null
      -- 注意:也可以传入集合
      select concat(array("a", "b", "c"));
      
    2. 指定拼接符:concat_ws(separator, [string | array(string)]+)

      select concat_ws('.', 'www', array('baidu', 'com')); -- 输出:"www.baidu.com"
      -- 注意1:可以存在元素为null,它会先去掉null,再拼接。比如:
      select concat_ws("#", "123", "abc", null); -- 输出:”123#abc“
      -- 注意2:全部元素为null时,返回的是空字符串'',而不是 null
      select concat_ws("#", null, null);
      -- 注意3:也可以传入集合
      select concat_ws("#", array("a", "b", "c"));
      
      1. 推荐使用concat_ws()函数时,使用空字符串''作为分隔符,因为会更加准确。会使得无用行只算一次,不要小看这一次,当concat_ws('',collection_nid_src,cuid),每个cuid会造成一条无效数据,如果有30万用户,使用''-就会相差30万条数据。
        当然最准确的做法是将脏数据提前过滤掉,比如:

        count(distinct case when collection_first='0' and collection_nid_src is not null and collection_nid_src != '' and cuid is not null and cuid != '' then concat_ws('-',collection_nid_src,cuid) end) 
        
      2. 为什么使用空字符串做分隔更加准确:

        • 使用''分隔:
          在这里插入图片描述
        • 使用'-'分隔:
          在这里插入图片描述
  2. 字符串切分

    1. 切分后是一个数组,可以通过下标访问元素:split(str, regex | separator)

      // 切分字符串
      select split('apache hive', ' '); -- 输出:['apache', 'hive']
      // 切分字符串并访问元素
      select split('apache hive', ' ')[0]; -- 输出:'apache'
      
      // 注意:切分null,结果为null
      select 
          split(null, ','),   -- 输出:NULL
          size(null)        -- 输出:-1
      

      注意:当待切分的对象中没有分隔符时,整个对象对作为一个元素

      // 比如
      select split('ab', ',');  -- 输出:['ab']
      
      // 切分空字符串也是同理
      select split('', ',');  -- 输出:['']
      
    2. 切分并访问元素:substring_index(要处理的字符串, 分隔符, num)

      -- 1. num可以为正
      select substring_index("www.baidu.com", '.', 1); -- 输出:www
      select substring_index("www.baidu.com", '.', 2); -- 输出:www.baidu
      select substring_index("www.baidu.com", '.', 3); -- 输出:www.baidu.com
      
      -- 2. num可以为负
      select substring_index("www.baidu.com", '.', -1); -- 输出:com
      
      -- 3. 像数组用下标一样访问中间元素: 两个方向结合即可
      select substring_index(
          substring_index("www.baidu.com", '.', 2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElegantCodingWH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值