• hive函数总结


    1.substr()函数

    substr()是字符串截取函数,其语法为: substr(string A, int start, int len),返回值为 string类型。说明:返回字符串A从start位置开始,长度为len的字符串。这里需要注意的是初始位置是从1开始。
    2.explode()函数–行转列

    explode函数可以将一个array或者map展开,其中explode(array)使得结果中将array列表里的每个元素生成一行;explode(map)使得结果中将map里的每一对元素作为一行,key为一列,value为一列,一般情况下,直接使用即可。

    • table_name 表名
    • map_col 为map类型的字段
    • may_key_col, may_value_col 分别对应map_col被拆分之后的map映射里的key 和 value
      select explode(map_col) as (may_key_col,may_value_col) from table_name
      (2)explode()函数的局限性
      不能关联原始表中的其他字段;
      不能与group by、cluster by、distribute by 、sort by 联用;
      不能进行udtf嵌套;
      不允许选择其他表达式。
      (3)需要结合lateral view 使用的情况介绍
      lateral view和udtf结合使用,会将udtf生成的结果放在一张虚拟表中(即lateral view里)虚拟表相当于再和主表关联,从而达到添加udtf生成的字段以外的字段,即主表里的字段或者主表运算后的字段。
      lateral view(多)应用举例1:
      select o.*, table_view.new_col
      from table_origin o
      lateral view UDTF(expression) table_view as new_col_1, new_col_2
      注释:
    • lateral view 表示将UDTF分裂的字段放在虚拟表中, 然后和主表table_origin进行关联。
    • UDTF(expression):复合逻辑规则的UDTF函数,最常用的是explode
    • table_view : 对应的虚拟表的表名
    • new_col: 虚拟表里存放的有效字段
    • from子句后面也可以跟多个lateral view语句,使用空格间隔就可以了。
    • 以上代码取出的是切割后的第一个值没有全部保留。
      lateral view(多)应用举例2:
      SELECT myCol1, myCol2 FROM baseTable
      LATERAL VIEW explode(col1) myTable1 AS myCol1
      LATERAL VIEW explode(col2) myTable2 AS myCol2;
      多个lateral_view联用中间使用空格隔开就可以了。
      LATERAL VIEW应用举例1扩展:
      原始数据格式:game_id,user_id,其中user_id使用‘[[[’作为分隔

    使用lateral view+explode后每一个id与炸裂出来的每一行进行笛卡尔积关联(即一列转多行).

    还有一种情况,当UDTF所转化的array是空的时候如何处理呢?
    在hive 0.12当中支持outer关键字,如果UDTF结果为空,默认会被忽略输出。如果加上outer关键字则会像left outer join一样,还是会输出select出的列,UDTF的输出结果是NULL

    3.collect_set()函数–列转行 将一列中的多行去重后合并成一行
    collect_set(col)函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。例如,要统计每种no下的score,直接对no分组后对score进行collect_set操作。

    4.collect_list()函数–列转行 将一列中的多行合并成一行
    5.concat_ws()函数–实现指定连接的作用
    concat_ws(‘,’ , collect_set(infodisptype)),将聚合的数据之间使用,做分割形成array。S
    特殊用法:用于判断聚合后的array中是否包含有期望的值
    array_contains(split(concat_ws(‘,’ , collect_set(infodisptype)),‘,’),‘shuaxin’)

    6.获取jsonarray中的value

    例:select json_tuple(aa.col,‘website’) from (select (
    split(
    regexp_replace(
    regexp_replace(‘[{“website”:“www.baidu.com”,“name”:“百度”},{“website”:“google.com”,“name”:“谷歌”}]’, ‘|

    ’,‘’),
    ‘\}\,\{’,‘\}\|\{’)
    ,‘\|’)[0]
    )as col )as aa

    7.使用正则表达式截取特定范围字符串
    select
    regexp_extract(infojson,‘“w”:“([^”]+)"’,1)
    from hdp_lbg_supin_zplisting.t_ods_zp_recsearch
    where dt = ‘${dateSuffix}’ limit 1000
    解析:参数1是传入的字段,参数二是正则‘()’内的才是真正要匹配出来的,参数3传入的数值是用于限定取得范围,
    0是显示与之匹配的整个字符串
    1 是显示第一个括号里面的
    2 是显示第二个括号里面的字段…

    8.一些hive相关的命令与参数
    hadoop fs -du -s -h
    hive外部表删除,数据还是存在hdfs上没有被删除的,只需要重建一下table,如果是分区表需要使用下面的命令修复就可以了
    MSCK REPAIR TABLE table_name
    hive 内部表被删除数据也一起被删除了。
    所以只有自己用的临时表才可以创建为内部表,生产环境下的表都创建为 external table。
    如果开启了回收站数据是可以找回的,需要在hdfs上的回收站里mv回到原路径然后重新创建表结构,如果是分区表需要加命令 MSCK REPAIR TABLE teat_table修复。

    1.关于if条件判断里的null,如果第一个判断条件是null的长度,不论判断条件如何写最终结果都是要运行if的第三个参数。
    SELECT if(length(null)>4,1,‘-’); – ‘-’
    SELECT if(length(null)<4,1,‘-’)-- ‘-’
    2.nvl(tjfrom,‘-’)函数作用是在参数1为null时替换成参数2;
    3.null在正则表达式中的使用。select null rlike ‘^\d+$’;–结果永远为null;
    4.关于日期格式你必须知道的坑( yyyy-MM-dd HH:mm:ss),码着提醒自己
    yyyy-MM-dd HH:mm:ss:代表将时间转换为24小时制,例: 2018-06-27 15:24:21
    yyyy-MM-dd hh:mm:ss:代表将时间转换为12小时制,例: 2018-06-27 03:24:21
    将日期时间转化为时间戳(10位):unix_timestamp(substring(refresh_time,0,19), ‘yyyy-MM-dd HH:mm:ss’)
    将时间戳转化为小时数(24小时):from_unixtime(cast(logtime/1000 as bigint),‘HH’) as `hours`
    5.关于``
    6.concat_ws和collect_set()函数联合使用–对某列的多行进行去重合并
    select subtype
    ,concat_ws(‘&’,collect_set(cast(from as string))) from
    ,concat_ws(‘&’,collect_set(cast(id as string))) id
    ,concat_ws(‘&’,collect_set(cast(name as string)))name
    ,concat_ws(‘&’,collect_set(cast(type as string))) type
    from aaaaaaa
    group by subtype;
    7.concat_ws和collect_list()函数联合使用–对某列不进行去重合并
    select subtype
    ,concat_ws(‘&’,collect_list(cast(from as string))) from
    ,concat_ws(‘&’,collect_list(cast(id as string))) id
    ,concat_ws(‘&’,collect_list(cast(name as string)))name
    ,concat_ws(‘&’,collect_list(cast(type as string))) type
    from aaaaaaa
    group by subtype;
    8.hive中使用正则匹配时候如需转义需要使用\双斜杠
    如果要匹配的字符里有“;”那么需要使用“;”的ascii码对应的八进制数字代替。否则遇“;”就结束了。
    9.hive中and和or连用时 and优先级高于or,需要在外层添加()来改变执行顺序。
    10.分区表新增一个字段,再插入数据会显示该字段为null,其实数据已经插入但是hive无法显示,解决办法如下:
    (1)cascade 关键字
    alter table hdp_lbg_supin_zplisting.ods_zp_actual_infodetail partition(dt=20200728) add columns(source string) CASCADE;
    (2)先drop掉表然后重新创建,再msck一下
    msck repair table hdp_lbg_supin_zplisting.ods_zp_actual_infodetail;
    (3)也可以这样做
    alter table tablename add columns(source string)
    然后正常写数据进去,然后执行如下操作,先删除分区再msck
    alter table partition_test drop partition(dt=‘a’);
    msck repair table partition_test
    11.coalesce(a,b) 如果a为 null返回b,如果ab都为null返回null
    12、打散操作

    1. 删除分区数据(数据本身未删除)
      alter table ods_z_n_a drop partition(dt=20200721);

    Hive SQL 查询结果导出到本地:
    第一步导出到文件夹
    方式1:导出到本地,文件格式为lzo
    首先在本地mkdir创建文件夹,然后执行以下操作,会在文件夹下生成.Lzo文件

    insert overwrite local directory “/home/hdp_lbg_supin/wanglizhou/output/”
    select * from hdp_lbg_supin_zplisting.dim_zp_bi_indicator;

    方式2:导出到本地,指定分割符”\t”

    insert overwrite local directory “/home/hdp_lbg_supin/wanglizhou/output”
    row format delimited fields terminated by “\t”
    select * from hdp_lbg_supin_zplisting.dim_zp_bi_indicator;
    方式3:直接在系统目录执行
    (1)sql语句放在一个叫做file.sql的文件中
    hive -f file.sql > /home/hdp_lbg_supin/wanglizhou/output/test.txt

    (2)sql语句放在字符串中 hive -e “sql ” > /home/hdp_lbg_supin/wanglizhou/output/test.txt

    第二步:文件导出到本地 sz + 文件名 如”sz /000000_0_0.lzo”
    如果是lzo需要先解压

    Lzo解压命令:解压文件 lzop -dv + 文件全路径
    lzop -dv /home/hdp_lbg_supin/wanglizhou/output/000000_0_0.lzo
    hadoop文件系统复制到本地需要使用copyToLocal命令,
    grep ‘xxx’ 目标文件名 -A 20 匹配查找到的及以后的20行内容

  • 相关阅读:
    【送书活动】揭秘分布式文件系统大规模元数据管理机制——以Alluxio文件系统为例
    手机照片一键去水印轻松摆脱不需要的旁观者
    opencv从入门到精通 哦吼02
    HashMap、HashTable、CurrentHashMap对比
    组件通信-父传子组件通信
    java计算机毕业设计VUE商场库存管理系统源码+mysql数据库+系统+lw文档+部署
    CV计算机视觉每日开源代码Paper with code速览-2023.10.23
    【kali-权限提升】(4.1)假冒令牌攻击、本地提权:流程
    TN、HTN、STN、FSTN、DSTN、CSTN、TFT、LCD 的区别
    Kubernetes跨StorageClass迁移,切换Rainbond默认SC
  • 原文地址:https://blog.csdn.net/DaDiNiWangGe/article/details/134030893