hive常用函数全集
作者:互联网
Hive 引言
# 简介
> hive是facebook开源,并捐献给了apache组织,作为apache组织的顶级项目(hive.apache.org)。 hive是一个基于大数据技术的数据仓库(DataWareHouse)技术,主要是通过将用户书写的SQL语句翻译成MapReduce代码,然后发布任务给MR框架执行,完成SQL 到 MapReduce的转换。可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
>
> **总结**
>
> - Hive是一个数据仓库(数据库)
> - Hive构建在HDFS上,可以存储海量数据。
> - Hive允许程序员使用**SQL命令**来完成数据的分布式计算,计算构建在yarn之上。(Hive会将**SQL转化为MR操作**)
>
> 优点:
> 简化程序员的开发难度,写SQL即可,避免了去写mapreduce,减少开发人员的学习成本
> 缺点:
> 延迟较高(MapReduce本身延迟,Hive SQL向MapReduce转化优化提交),适合做大数据的离线处理(TB PB级别的数据,统计结果延迟1天产出)
> Hive不适合场景:
> 1:小数据量, MySQL。
> 2:实时计算:Flink/Spark HBase
- 数据库 DataBase
- 数据量级小,数据价值高
- 数据仓库 DataWareHouse
- 数据体量大,数据价值低
启动hive
# 本地模式启动 【管理员模式】
# 启动hive服务器,同时进入hive的客户端。只能通过本地方式访问。
[root@hadoop10 ~]# hive
Logging initialized using configuration in jar:file:/opt/installs/hive1.2.1/lib/hive-common-1.2.1.jar!/hive-log4j.properties
hive>
# 启动hive的服务器,可以允许远程连接方式访问。
// 前台启动
[root@hadoop10 ~]# hiveserver2
// 后台启动
[root@hadoop10 ~]# hiveserver2 &
# beeline客户端··
# 启动客户端
[root@hadoop10 ~]# beeline
beeline> !connect jdbc:hive2://hadoop10:10000
回车输入mysql用户名
回车输入mysql密码
HQL高级
# 0. 各个数据类型的字段访问(array、map、struct)
# array类型:字段名[index];map类型:字段名[key];struct类型:字段名.属性名
select name,salary,hobbies[1],cards['123456'],addr.city from t_person;
# 1. 条件查询:= != >= <=
select * from t_person where addr.city='郑州';
# 2. and or between and
# array_contains(字段,值):函数,针对array类型的字段,判断数组里面包含指定的值
select * from t_person where salary>5000 and array_contains(hobbies,'抽烟');
# 3. order by[底层会启动mapreduce进行排序]
select * from t_person order by salary desc;
# 4. limit(hive没有起始下标)
select * from t_person sort by salary desc limit 5;
# 5. 去重 distinct
select distinct addr.city from t_person;
select distinct(addr.city) from t_person;
单行函数(show functions) --对一行数据进行操作
#查看所有函数
-- 查看hive系统所有函数
show functions;
--函数的使用:函数名(参数)
1. array_contains(列,值);--判断数组列中是否包含指定的值
select name,hobbies from t_person where array_contains(hobbies,'喝酒');
2. length(列)--获取到长度
select length('123123');
3. concat(列,列)--拼接
select concat('123123','aaaa');
4. to_date('1999-9-9')--字符串转换成日期
select to_date('1999-9-9');
5. year(date)--获取日期类型的年,month(date)--获取日期类型的月份,
6. date_add(date,数字)--日期加多少天
select name,date_add(birthday,-9) from t_person;
炸裂函数(集合函数):由一行数据计算完成之后获得多行数据
-- 查询所有的爱好,explode
select explode(hobbies) as hobby from t_person
常见的函数
# lateral view
-- 为指定表,的边缘拼接一个列。(类似表连接)
-- lateral view:为表的拼接一个列(炸裂结果)
-- 语法:from 表 lateral view explode(数组字段) 别名 as 字段名;
# collect_list(组函数)
作用:对分组后的,每个组的某个列的值进行收集汇总。
语法:select collect_list(列) from 表 group by 分组列;
例: select username,collect_list(video_name) from t_visit_video group by username;
数据:
id username
1 ["a","b"]
2 ["a","a","b"]
# collect_set(组函数)
作用:对分组后的,每个组的某个列的值进行收集汇总,并去掉重复值。
语法:select collect_set(列) from 表 group by 分组列;
例: select username,collect_set(video_name) from t_visit_video group by username;
数据:
id username
1 ["a","b"]
2 ["a","C","b"]
# concat_ws(单行函数):指定分隔符
作用:如果某个字段是数组,对该值得多个元素使用指定分隔符拼接。
select id,name,concat_ws(',',hobbies) from t_person;
--# 将t_visit_video数据转化为如下效果
--统计每个人,2020-3-21看过的电影。
例: select username,concat_ws(',',collect_set(video_name)) from t_visit_video group by username;
数据:
id username
1 a,b
2 a,C,b
全排序和局部排序
# 全局排序
语法:select * from 表 order by 字段 asc|desc;
# 局部排序(分区排序)
概念:启动多个reduceTask,对数据进行排序(预排序),局部有序。
局部排序关键词 sort by
默认reducetask个数只有1个,所有分区也只有一个。所以默认和全排序效果一样。
语法:select * from 表 distribute by 分区字段 sort by 字段 asc|desc;
外部表和分区表
# 创建表语法 external 代表为外部表
row format delimited 表示自定义分隔符
partitioned by(country string,city string) 表示为分区表
create external table t_personout(
id int,
name string,
salary double,
birthday date,
sex char(1),
hobbies array<string>,
cards map<string,string>,
addr struct<city:string,zipCode:string>
)
#partitioned by(country string,city string)
#row format delimited
fields terminated by ',' --列的分割
collection items terminated by '-'--数组 struct的属性 map的kv和kv之间
map keys terminated by '|'
lines terminated by '\n'
location '/file';
# 导入数据命令
# 在hive命令行中执行
-- local 代表本地路径,如果不写,代表读取文件来自于HDFS
-- overwrite 是覆盖的意思,可以省略。
load data [local] inpath ‘/opt/datas/person.txt’ [overwrite] into table t_person;
# 本质上就是将数据上传到hdfs中(数据是受hive的管理)
#可执行的导入数据的命令
load data local inpath '/opt/data/person.txt' into table t_person;
自定义函数 UDF和UDTF
# 0. 导入hive依赖
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1</version>
</dependency>
# 1.定义一个类继承UDF
1. 必须继承UDF GenericUDTF
2. 方法名必须是evaluate initialize
-- 创建永久函数与开发好的java class关联
create function base_analizer as 'UDF.FileUdf' # 全类名
using jar 'hdfs://synthesize60:9000/user/hive/jars/aofflineforwarehouse.jar' # hdfs上的路径;
-- 删除永久函数
drop function flat_analizer;
表数据转存导入操作
# 1.将文件数据导入hive表中,
load data local inpath '文件的路径' overwrite into table 表。
# 2.直接将查询结果,放入一个新创建的表中。(执行查询的创建)
create table 表 as select语...
1. 执行select语句
2. 创建一个新的表,将查询结果存入表中。
# 3.将查询结果,导入已经存在表。
insert into 表
select语句...
# 4.将HDFS中已经存在文件,导入新建的hive表中
create table Xxx(
...
)row format delimited
fields terminated by ','
location 'hdfs的表数据对应的目录'
# 将SQL的执行结果插入到另一个表中
create table 表 as select语句
--## 例子:
--统计每个人,2020-3-21看过的电影,将结果存入hive的表:t_video_log_20200321
create table t_video_log_20200321 as select ...;
标签:函数,--,数据,hive,person,video,全集,select 来源: https://www.cnblogs.com/hzhl/p/14140638.html