Hive 基础函数

1、日期函数

当前系统时间

sql 复制代码
-- 当前系统日期 格式:"yyyy-MM-dd"
select current_date();

-- 当前系统时间:格式:"yyyy-MM-dd HH:mm:ss.ms"
select current_timestamp(); 

--当前系统时间戳 格式:距离1970年1月1日0点的秒数
select unix_timestamp(); 

日期转时间戳

sql 复制代码
--2020-01-21 08:00:00 距离1970年1月1日0点的秒数
select unix_timestamp('2020-01-21 08:00:00');
 
--2020-01-21 距离1970年1月1日0点的秒数
select unix_timestamp('2020-01-21','yyyy-MM-dd');
 
--2020/01/21 距离1970年1月1日0点的秒数
select unix_timestamp('2020/01/21','yyyy/MM/dd');

时间戳转日期

sql 复制代码
--根据时间戳转日期 (默认格式 yyyy-MM-dd HH~mm~ss)
select from_unixtime(1579622400);

--根据时间戳转日期,指定输出格式:
select from_unixtime(1693046606,'yyyy/MM/dd HH~mm~ss');

unix_timestamp 函数是将一个字符串,变为了一个时间戳

from_unixtime 函数是将时间戳变为了一个字符串

日期时间分量

sql 复制代码
select  year(current_timestamp()), 
        month(current_timestamp()),  
		day(current_timestamp()),
	   	hour(current_timestamp()), 
		minute(current_timestamp()), 
		second(current_timestamp())

日期加减函数

sql 复制代码
-- 计算两个日期相差的天数 59
select datediff('2025-03-01','2025-01-01');

-- 计算两个日期相差的月数 2
select months_between('2025-03-01','2025-01-01');

-- 加天数 2025-01-04
select date_add('2025-01-01',3);

-- 减天数 2024-12-29
select date_sub('2025-01-01',3);

--加月份 2025-04-01
select add_months('2025-01-01',3);

--减月份 2024-10-01
select add_months('2025-01-01',-3);

计算时间差函数

sql 复制代码
-- 计算日期相差的天数:31
select datediff('2025-02-01','2025-01-01');

--计算日期相差的月数: 1
select months_between('2025-02-01','2025-01-01');

日期定位函数

sql 复制代码
--月末:
select  last_day(current_date());

--可以求出当前日期的下个星期几
select next_day(current_date(),'thursday');

字符串转日期

sql 复制代码
select to_date('2023-07-01');

将日期转为字符串

sql 复制代码
select date_format(current_timestamp(),'yyyy-MM-dd');
select date_format(current_timestamp(),'yyyy-MM-dd HH:mm:ss');
select date_format('2017-01-01','yyyy-MM-dd HH:mm:ss');

2、字符串函数

sql 复制代码
--转大写: ABC
select upper('abc');

-- 转小写: abc
select lower('ABC');

--字符串长度: 3
select length('abc');

-- 字符串拼接: ABC
select concat('AB', 'C');

-- 字符串截取: cde
select substr('abcde',3);

-- 字符串拼接,指定分隔符: A-B-C
select concat_ws('-','A' ,'B','C');

-- 字符串分割,指定分隔符:返回数组["a","b","c","d","e","f"]
select split("a-b-c-d-e-f","-");

--分割后在拼接:a&b&c&d&f
select concat_ws('&',split('a,b,c,d,f',','));

--替换分隔符:a&b&c&d&f
select replace('a,b,c,d,f',',','&');

3、类型转换函数

sql 复制代码
-- string转int
select  cast('123' as int);

-- int转string
select  cast(123  as string); 

4、数学函数

sql 复制代码
--round 四舍五入:42
select round(42.3);

--ceil 向上取整:43
select ceil(42.3);

--floor 向下取整:42
select floor(42.3);

-- 求绝对值:1
select abs(-1);

--取模函数:1
select pmod(3,2);

5、Hive 其他函数

nvl

sql 复制代码
--如果为null,给一个默认值
select nvl(null,100);

case when then ....when ...then.. else... end

准备数据如下:

sql 复制代码
张三	A	男
李四	A	男
王五	B	男
赵六	A	女
琪琪	B	女
巴巴	B	女

建表

sql 复制代码
create table emp_sex(
    name string, 
    dept_id string, 
    sex string
) 
row format delimited fields terminated by "\t";

导入数据:

sql 复制代码
load data local inpath '/home/hivedata/test_a.txt' 
into table emp_sex;

统计男女人数

sql 复制代码
select sex,count(1) 
from emp_sex group by sex;
sql 复制代码
还有其他写法:
select  
   sum(case when sex='男' then 1 else 0 end) as `男`,
   sum(case when sex='女' then 1 else 0 end) as `女`
from emp_sex;

还可以使用类似于switch的写法:
select  
   sum(case sex when '男' then 1 else 0 end) as man ,
   sum(case sex when '女' then 1 else 0 end) as women
from emp_sex;

hive中的字段的别名,英文别名不要使用单引号或者双引号,直接写就行,如果是中文的别名需要添加反引号``

if(p1,p2,p3)

sql 复制代码
--如果为true,则取第一个值,否则取第二个值
select if(1==1,1,2);

拓展:以下三个一个效果
select if(comm is null,0,comm) from emp;
select nvl(comm,0) from emp;
select case when comm is null then 0 else comm end from emp;

get_json_object

sql 复制代码
--从json数据中获取值:19
select get_json_object('{"name":"jack","age":19}','$.age');

parse_url

sql 复制代码
--获取url中的HOST: www.baidu.com
select parse_url('http://www.baidu.com/path1/path2?k1=v1&k2=v2','HOST');

-- 获取PROTOCOL中的协议: http
select parse_url('http://www.baidu.com/path1/path2?k1=v1&k2=v2','PROTOCOL');

-- 获取Path: /path1/path2
select parse_url('http://www.baidu.com/path1/path2?k1=v1&k2=v2','PATH');

-- 获取url后面的参数以及参数的值:name=zhangsan&age=18,zhangsan
select parse_url('http://www.baidu.com/path1/parth2?name=zhangsan&age=18','QUERY');
select parse_url('http://www.baidu.com/path1/parth2?name=zhangsan&age=18','QUERY','name');

coalesce(col1,col2,col3...)

sql 复制代码
--返回第一个不为空的数据
select coalesce(null,1,23,4);

array_contains

有如下数据,表示1、2、3三名学生选修了a、b、c中的若干课程

sql 复制代码
id  course
1	a
1	b
2	a
2	c
3	b
3	c

建表并加载数据

sql 复制代码
--建表
create  table courses (
    id  int,
    course string
)
row format delimited
fields terminated by '\t';
 
--加载数据
load data local inpath '/home/hivedata/course.txt' into table courses;

根据如上数据,查询出如下结果,其中1表示选修,0表示未选修

sql 复制代码
id  a  b  c
1   1  1  0
2   1  0  1
3   0  1  1
sql 复制代码
--第一种方法
select id,
       sum(case when course='a' then 1 else 0 end ) a,
       sum(case when course='b' then 1 else 0 end ) b,
       sum(case when course='c' then 1 else 0 end ) c
       from zhoukao03 group by id;

--第二种方法
select id,
       if(array_contains(collect_set(course),'a'),1,0) a,
       if(array_contains(collect_set(course),'b'),1,0) b,
       if(array_contains(collect_set(course),'c'),1,0) c
       from courses group by id;

-- 第三种写法
select id,
       sum(if(course=='a',1,0)) `a`,
       sum(if(course=='b',1,0)) `b`,
       sum(if(course=='c',1,0)) `c`
       from courses group by id;
相关推荐
kuroomi43 分钟前
hadoop高可用架构
hadoop
APItesterCris21 小时前
告别人工盯品:借助 OpenClaw 搭建商品自动监控与数据分析系统(完整实操)
大数据·数据库·数据仓库·自动化
千里码aicood1 天前
基于Hadoop的汽车销量分析与可视化
大数据·hadoop·分布式
AbnerWright2 天前
读书笔记-数据密集型应用系统设计
数据仓库
wxchyy3 天前
手把手教你入门云计算(二):这些技术改变了世界,你也能轻松掌握
hadoop·阿里云·docker·云原生·华为云·云计算·运维开发
BD_Marathon3 天前
Hadoop组成
大数据·hadoop·分布式
zgl_200537793 天前
源代码:跨数据库通用“字段级”数据血缘解析与图形化(2/3:标注信息的拆解、检验、保存)
大数据·数据库·数据仓库·sql·数据挖掘·etl·嵌入式实时数据库
邀星月为媒3 天前
正式迁移 Gitee:core-site-hive 与 core-hive-agent 后续更新只认这两个地址
hive·hadoop·gitee
BD_Marathon3 天前
Hadoop常用端口号
java·大数据·hadoop