当前位置: 首页 > article >正文

【Hive复杂数据类型和函数】全网总结最全的Hive函数

文章目录

  • 一、复杂数据类型的建表语句
    • 1、array
    • 2、map
    • 3、struct
  • 二、Hive函数
    • 1、炸裂函数explode(行转列)
    • 2、日期函数
    • 3、字符串函数
    • 4、类型转换函数
    • 5、其他函数
    • 6、窗口函数
    • 7、序列函数
    • 8、排名函数
    • 9、自定义函数


一、复杂数据类型的建表语句

1、array

create table arr1(
  name string,
  scores array<int>
)
row format delimited
fields terminated by '\t'
collection items terminated by ','   -- 集合的分隔符

2、map

create table map1(
    name string,
    scores map<string,int>
)
row format delimited
fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':';

3、struct

create table if not exists struct1(
name string,
score struct<chinese:int,math:int,english:int,natrue:int>
)
row format delimited 
fields terminated by '\t'
collection items terminated by ',';

二、Hive函数

1、炸裂函数explode(行转列)

select name,subject,chengji 
from map1 
lateral view explode(scores) myscore as subject,chengji;

lateral view explode(scores) 是一个炸出来的虚拟表,myscore是虚拟表的别名,subject,chengji为炸出来列的别名

2、日期函数

current_date();   -- 当前系统日期 :yyyy-MM-dd
current_timestamp();  -- 当前系统日期:yyyy-MM-dd HH:mm:ss.ms
unix_timestamp();  -- 日期转时间戳,可以指定输入日期格式
from_unixtime();  -- 时间戳转日期,可以指定输出日期格式
datediff();  -- 求两个时间的差值
last_day();  -- 求本月的最后一天
to_date();  --字符串转成日期格式
date_format();  -- 日期转成字符串格式

3、字符串函数

concat(subject,":",cj)  -- 将subject和cj字段用:拼接起来
collect_list()   -- 将括号里面的数据存放到一个list集合中,有序的
collect_set()    -- 将括号里面的数据存放到一个set集合中,无序的
concat_ws(',',list)   -- 将list集合中的数据以逗号拼接起来,变成字符串
str_to_map()    -- 将字符串变为map集合
replace('a,b,c,d,f',',','&');  -- 替换

4、类型转换函数

cast(‘123’ as int); – 将字符串类型转换为 int 类型

5、其他函数

nvl();  -- 相当于mysql中的ifnull()
get_json_object('{"name":"jack","age":19}','$.age');  --从json中获取指定的值
parse_url('http://www.baidu.com/path1/path2?k1=v1&k2=v2','HOST');  
-- 解析一个字符串中的url参数 第二个参数可以是 HOST(域名)、 PROTOCOL(协议)、PATH(路径)、QUERY(参数)以及值
coalesce();  -- 返回第一个不为空的数据

6、窗口函数

既要明细信息,也要聚合信息,就直接开窗
在这里插入图片描述

语法:

distribute by ... sort by = partition by ... order by

window 子句:
在这里插入图片描述

如果要对窗口的结果做更细粒度的划分,那么就使用window子句,常见的有下面几个
preceding:往前
following:往后
currect row :当前行
unbounded preceding :起点
unbounded following :终点

select name,orderdate,cost,
       sum(cost) over() as sample1, -- 所有行相加
       
       sum(cost) over(partition by name) as sample2,-- 按name分组,组内数据相加
       
       sum(cost) over(partition by name order by orderdate) as sample3,-- 按name分组,组内数据累加
       sum(cost) over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and current row )  as sample4 ,-- 与sample3一样,由起点到当前行的聚合
       
       sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING   and current row) as sample5, -- 当前行和前面一行做聚合
       
       sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING   AND 1 FOLLOWING  ) as sample6,-- 当前行和前边一行及后面一行
       
       sum(cost) over(partition by name order by orderdate rows between current row and UNBOUNDED FOLLOWING ) as sample7 -- 当前行及后面所有行
       
from t_order;

7、序列函数

ntile函数:

ntile 是Hive很强大的一个分析函数。可以看成是:它把有序的数据集合 平均分配 到 指定的数量(num)个桶中, 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差1

select name,orderdate,cost,
ntile(3) over(partition by name) -- 按照name进行分组,在分组内将数据切成3份
from t_order

lag和lead函数:

lag返回当前数据行的前第n行的数据 语法:lag(colName,n[,default value]): 取字段的前第n个值。如果为null,显示默认值 lead返回当前数据行的后第n行的数据

first_value和last_value函数:

first_value 取分组内排序后,截止到当前行,第一个出现的值 last_value 分组内排序后,截止到当前行,最后一个出现的值

8、排名函数

row_numbe():

row_number从1开始,按照顺序,生成分组内记录的序列,row_number()的值不会存在重复,当排序的值相同时,按照表中记录的顺序进行排列

效果如下:
98 1
97 2
97 3
96 4
95 5
95 6

没有并列名次情况,顺序递增

rank():

生成数据项在分组中的排名,排名相等会在名次中留下空位

效果如下:
98 1
97 2
97 2
96 4
95 5
95 5
94 7
有并列名次情况,顺序跳跃递增
dense_rank():

生成数据项在分组中的排名,排名相等会在名次中不会留下空位

效果如下:
98 1
97 2
97 2
96 3
95 4
95 4
94 5
有并列名次情况,顺序递增

9、自定义函数

需要java代码 去extends GenericUDF类,并实现里面的三个方法

hive自定义函数中无法返回集合数据类型


http://www.kler.cn/a/372289.html

相关文章:

  • 【GUI-pyqt5】QWidget类
  • 论文泛读《LPFHE: Low-Complexity Polynomial CNNs for Secure Inference over FHE》
  • SAP SD销售模块常见BAPI函数
  • Git快速入门(三)·远程仓库GitHub以及Gitee的使用
  • 【three.js】材质(Material)
  • 自从学会Git,感觉打开了一扇新大门
  • Next.js、Prisma 和 MySQL 实践示例
  • js获取浏览器指纹
  • rabbitmq高级特性(1):消息确认,持久性,发送方确认和重试机制
  • 在软件工程开发中,瀑布式开发和螺旋式开发的优缺点比较
  • 【数据结构】树-二叉树-堆(上)
  • 堆Heap
  • 医院信息化与智能化系统(13)
  • React Query已过时?新一代请求工具横空出世
  • 日本也有九九乘法表?你会读吗?柯桥零基础学日语到蓝天广场
  • openharmony北向开发入门教程汇总
  • 【非关系型分布式数据库】HBase从入门到面试学习总结
  • Python实现随机分布式延迟PSO优化算法(RODDPSO)优化DBSCAN膨胀聚类模型项目实战
  • IDEA 安装热部署 JRebel -新版-亲测有效
  • Android13预置应用及授权开发
  • Thread类及线程的核心操作
  • Java集合常见面试题总结(5)
  • 常见的开发工具及其作用
  • [论文阅读] GPT-4 Technical Report
  • Kotlin-协程基础
  • 【面试经典150】day 9