第十九章 hive

发布于:2024-04-16 ⋅ 阅读:(25) ⋅ 点赞:(0)

接上章的内置函数

1)内置函数


1    日期类型操作

1-1   获取当前日期   current_data          
   
         获取当前日期时间   current_timestamp   
 
        获取unix 时间  (从1970年1月1号0时0分0秒 到现在过去了多少秒)      unix_timestamp

unix时间 和日期时间的转化

 日期时间转为unix               select unix_timestamp (‘2023-10-01 15:30:28‘);    自动转化为多少秒

  将unix转为时间日期              select unix_timestamp (1678123123);  

年月日的取值

select year  (’2023-10-10 10:10:10:10‘);          year可以换month   day


select dayofmonth (’2023-10-10 10:10:10:10‘);


select dayofweek (’2023-10-10 10:10:10:10‘);

select hour/minute/second (’2023-10-10 10:10:10:10‘)

select date_add (’2023-10-10 10:10:10:10‘,5)

select date_add (’2023-10-10 10:10:10:10‘,-5)

比较时间相差多少天

select  datediff (current_date () '2023-10-10 ')


1-2 类型转化


计算时转化数据类型 (只在计算时进行)

select cast(字段 as bigint)from 表名;

隐式转化 hive会自动2判断进行转化数据然后计算

select '123' +'456';

手动指定转化

select cast('123' as int )+ cast ('456' as int );


1-3 字符串数据转json,array,map操作


josn字符串操作

创表时字符类型为字符串 string

数据是一个 '' { key : value } '' 格式

使用方法

对字段中的json字符串数据进行取值,按照key取value值

方法1  get_json_object  (每次只能取一个字段)

select get_json_objec(文件,'$.字段') as 别名 from 表名

方法2  json_tuple  一次取多个值

select get_json_tuple(文件,'字段','字段','字段','字段') as  别名,  别名 ,别名 ,别名 ,别名  from 表名


2) DQL

正则

rlike 的正则表达式

--表达式就是通过不同的符号来表示不同的数据进行匹配

--\d 匹配数据的表达是  \w  匹配字符字母   \s 匹配空格

例如 :  select * from 表名 where 字段  rlike '\w' ; 

不如直接用 select 字段,split(email,’@‘)[0] form 表名

例如  select enail,split(split(email,'@')[1],'\\.')[0] from 表名

2-1 多表关联 join 和union


join :

 inner join

left

right

union合并:

select count(*)表名1 where 字段 is not null;
union
select count(*)表名2 where 字段 is not null;

-- 保留重复数据

select 字段,字段 from 表名;
union all
select 字段,字段 from 表名2;

union all  可以把全部数据全部保留 重复的也保留  不去重


3)

窗口函数!!! 需要mysql8.0 以上

默认没有窗口函数进行计算时全表数据获取计算

根据指定的窗口范围计算数据,将计算结果单独呈现一列展示,不会因为聚合改变行数

3.1.   over(partition by 分组字段 order by 排序字段 rows between 起始行 and 结束行)

rows 指定计算的行范围

over前面可以和聚合使用,取值函数,排序函数

3.2  聚合函数

select 字段,字段,sum(字段) over(partition by 字段) from 表名;

partition by 后可以有多个分组

3.3 取值操作   

lag(字段) 向上取值      lag(字段,2) 向上两行取值

select 字段1,字段2,lag(字段2)over()  from 表名 ;

select 字段1,字段2,lag(字段2,2)over()  from 表名 ;

取不到值就会显示null

select 字段1,字段2,lag(字段2,2,'it')over()  from 表名 ; 

it表示如果是null则会显示it

向下取值同理

lead(字段) 向下取值      lead(字段,2) 向下两行取值


取第一个值first_value(字段)


3.4

排序窗口

排序

rank()              当有人一样时就会 12335排序

dense_rank()   当有人一样时就会12334排序

row_number()     当有人一样时依旧按照12345排序

select * from (select dense_rank(字段)over (partition by 字段2)  from  表名 )where 条件;