Hive
一. hive中的数据类型
hive中的数据类型主要分为:
(1)基本数据类型
1.数值型:主要就是用来保存数字
整数型
tinyint :1字节
smallint :2字节
int :4字节
bigint :8字节
浮点型
float :4字节
double :8字节
2.字符串类型
String,长度可变的字符串
3.布尔类型
boolean
4.时间类型
date:大时间类型,一般只保存年月日
timestamp:时间戳类型,可以精确到毫秒和纳秒
(2)复杂数据类型:
1.array:数组,用来保存一组相同数据类型的数据的集合
数组元素:数组中保存的每一个数据叫做数组元素
数组长度:数组中保存元素的个数
在hive中数组使用[]来表示
在hive中建表的时候数组的定义语法:
字段名 array<数据类型>
2.map:字典,集合
主要用来保存一对数据,里面保存的数据都要成对出现,键值对
在hive中建表的时候map字典的定义语法:
字段名 map<数据类型,数据类型>
3.struct:结构体,功能类似于c语言中的结构体
在创建表的时候必须要将键设置好
在hive中建表的时候struct字典的定义语法:
字段名 struct<键:数据类型,键:数据类型,...>
查询函数的结构和用法:
desc function 函数名 查看函数的用户和语法结构
desc function extended 函数名 可以显示函数的用法语法结构和示例。
1.数字类函数:
round(x,d):进行四舍五入。
ceil()|ceiling():向上取整
floor():向下取整
mod():求余数
rand():获取随机数,默认产生的是0-1之间,包含0但是不包含1.
sqrt():开平方
pow(x,y)|power(x,y):计算x的y次方
bin():返回一个数字的二进制表示
2.时间类的函数:
current_date():获取当前的年月日
current_timestamp():获取当前的完成的日期时间,包含纳秒
--获取当前经过的秒数
select unix_timestamp();
--将时间字符串转换成秒数
select unix_timestamp('2021-3-15','yyyy-MM-dd');
--将秒数转换成时间字符串
select from_unixtime(1615737600,'yyyyMMdd');
--将日期字符串转换成日期对象,只获取年月日
select to_date('2022-3-20 12:30:56');
--将时间字符串转换成时间戳
select cast('2022-3-20 12:30:56' as timestamp);
--将一个数字字符串转换成int类型
select cast('19' as int);
--获取年份
select year('2022-3-15');
--获取月
select month('2022-3-15');
--获取天
select day('2022-3-15');
--获取小时
select hour('2022-3-15 13:56:30');
--分钟
select minute('2022-3-15 13:56:30');
--秒
select second('2022-3-15 13:56:30');
--加上多少天
select date_add(`current_date`(),3);
--减去多少天
select date_sub(`current_date`(),-3);
--将时间定位到指定年份的第一天,注意参数必须是一个时间戳类型
select floor_year(`current_timestamp`());
select floor_year(cast('2022-4-15' as timestamp));
--获取指定月份的第一天
select floor_month(`current_timestamp`());
--获取指定周的第一天:周一
select floor_week(`current_timestamp`());
--获取指定季度的第一天:
select floor_quarter(`current_timestamp`());
--获取两个时间之间的天数
select datediff('2022-1-30','2022-5-18');
--获取下个指定的星期几 :MO TU WED TH FR STA SUN
select next_day(`current_date`(),'FR');
--加上多少个月
select add_months(`current_date`(),10);
--获取指定时间的月份的最后一天
select last_day(`current_date`());
3.字符串类的函数:
--将员工的姓名和职位进行拼接,如果拼接的字符串中有一个是空的则最后的结果是null
select concat(ename,job) from emp1;
--将员工的姓名和奖金拼接到一起
select concat(ename,nvl(comm,'')) from emp1;
--可以指定拼接符,第一个参数必须要指定拼接符,后面的参数必须是字符串类型。
select concat_ws('-',ename,cast(comm as string)) from emp1;
--返回字符串的长度
select length(ename) from emp1;
--将字符串进行反转
select reverse(ename) from emp1;
--去除字符串中左右两边的空格
select trim(' sd f ') ;
select ltrim(' sdf ');
select rtrim(' sdf ');
--字符串的截取substring(),最后参数代表截取的长度,如果不写则代表截取到字符串的末尾
select substr('border.png',7,2);
--大小写转换
--作用等同upper
select ucase('hello');
--作用等同于lower
select lcase("ASADF");
json数据:
json是javascript中的一种对象表示方式,是现在系统中前后段进行数据交互的一种主要形式。
json数据主要包含两种对象:
1.对象:主要是用{}括起来,里面数据都必须要成对出现,一个键要对应一个值,并且键不能重复,键的数据类型必须是字符串类型
值没有要求。
{“name”:"张三","age":19,"sex":"男"}
2.数组:在json中数组使用[]表示,数组中元素之间使用逗号分开。
--重点
--1.json数据解析函数
/*
解析json数据使用:$
语法:访问对象中的某一个键对应的值
$.键
访问数组中的某一条数据
$.[下标]
*/
--get_json_object():
select get_json_object(json_str,'$.[0].content') from jsontest;
--将一个字符串转换成一个map结构,第一个参数:要转换的字符串,第二个参数:元素之间的分隔符,第三个参数:键和值的分隔符
select str_to_map('name=zhangsan,age=18,sex=男',',','=');
--将字符串按照指定的分隔符拆分成一个字符串数组
select split('wqeq,werwe,dgdf,xvzxc',',')[3];
--将某一列的数据拼接成一行(数组),功能类似于listagg,必须要对数据进行分组
select deptno,collect_set(ename)[1] from emp1 group by deptno;
--查看某一个列表中的某一个元素的位置,第一个参数代表需要查询的子字符串,第二个参数就是原来的字符串
select find_in_set('dgdf','wqeq,werwe,dgdf,xvzxc');
4.选择函数
--case when
select e.*,case when sal>=3000 then '高收入'
when sal>=2000 then '中收入'
else '低收入' end
from emp1 e;
--if函数
--语法:if(条件,语句1,语句2):当条件成立,则执行语句1,否则执行语句2
select e.*,if(comm is null,100,comm+100) from emp1 e;
5.分析函数:
--分析开窗函数:和Oracle中的是一样
--语法:函数() over(partition by 字段 order by 字段)
--排名函数:row_number() rank() dense_rank()
--移动函数:lead() lag()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?