Hive基本操作

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。本文描述了HIve的一些基本操作,如有错误之处还请指出。

常用语法 #显示相关信息 show tables; show databases; show partitions; show functions; desc extended table_name; desc formatted table_name; #创建库 create database test_db; #删除库 drop database 库名; #删除表 drop table 表名; #重命名表名 ALTER TABLE table_name RENAME TO new_table_name; #清空表数据 truncate table 表名; 建表语句 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path] 创建内部表 create table if not exists my_tb(id int,name string) row format delimited fields terminated by ','; 创建外部表 #创建外部表要指明表的数据所在路径 create table if not exists my_ex_tb(id int,name string) row format delimited fields terminated by ',' location 'hdfs://192.168.38.3:9000/externdb/my_ex_tb/';

在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

加载数据到表目录下 #在表的最后插入或覆盖整个表的数据(into/overwrite) load data local inpath '/root/1.txt' into(overwrite) table my_ex_tb; 创建分区表 create table if not exists my_par_tb(id int,name string) partitioned by(country string) row format delimited fields terminated by ','; load data local inpath '/root/1.txt' into table my_par_tb partition(country='China'); load data local inpath '/root/1.txt.us' into table my_par_tb partition(country='US'); #1.txt中的数据 1,张三 2,李四 3,王五 #1.txt.us中的数据 1,张三 2,李四 3,王五 #select * from my_par_tb显示的数据 1 张三 China 2 李四 China 3 王五 China 1 张三 US 2 李四 US 3 王五 US #查某个分区里的数据 select * from my_par_tb where country='China' 1 张三 China 2 李四 China 3 王五 China 添加删除分区 #添加分区 alter table my_par_tb add partition(country='Eng') partition(country='Ame'); #删除分区 alter table my_par_tb drop partition(country='Eng') partition(country='Ame'); #显示表中的分区 show partitions my_par_tb; country=China country=US 创建分桶表 create table if not exists my_buck_tb(id int,name string) clustered by(id) sorted by(id) into 4 buckets row format delimited fields terminated by ','; #指定开启分桶 set hive.enforce.bucketing=true; #分了几个桶就设置几个reduce,将从其他表中查出来多个文件,分表放入到多个桶里。 set mapreduce.job.reduces=4; #从my_tb表中查出数据插入到分桶表里 insert into table my_buck_tb #指定map输出的数据根据id去分区,排序(cluster by等价于distribute by+sort by的效果) select id,name from my_tb cluster by(id); 保存查询结果

默认情况下查询结果显示在屏幕上,可以将查询结果保存到表里。

#将查询结果保存到一张新创建的表中 create table tmp_tb as select * from my_tb; #将查询结果保存到一张已经存在的表中 insert into table tmp_tb select * from my_tb; #将查询结果保存到指定目录下(本地或hdfs上) #本地 insert overwrite local directory '/root/out_tb/' select * from my_tb; #hdfs insert overwrite directory '/out_tb/' select * from my_tb; join操作 a表数据: 1,张三 2,李四 3,c 4,a 5,e 6,r b表数据: 1,绿间 3,青峰 4,黑子 9,红发 建表: create table a(id int,name string) row format delimited fields terminated by ','; create table b(id int,name string) row format delimited fields terminated by ','; 导入数据: load data local inpath '/root/a.txt' into table a; load data local inpath '/root/b.txt' into table b; #内连接(交集) select * from a inner join b on a.id=b.id; +-------+---------+-------+---------+--+ | a.id | a.name | b.id | b.name | +-------+---------+-------+---------+--+ | 1 | 张三 | 1 | 绿间 | | 3 | c | 3 | 青峰 | | 4 | a | 4 | 黑子 | +-------+---------+-------+---------+--+ #左连接 select * from a left join b on a.id=b.id; +-------+---------+-------+---------+--+ | a.id | a.name | b.id | b.name | +-------+---------+-------+---------+--+ | 1 | 张三 | 1 | 绿间 | | 2 | 李四 | NULL | NULL | | 3 | c | 3 | 青峰 | | 4 | a | 4 | 黑子 | | 5 | e | NULL | NULL | | 6 | r | NULL | NULL | +-------+---------+-------+---------+--+ #右连接 select * from a right join b on a.id=b.id; +-------+---------+-------+---------+--+ | a.id | a.name | b.id | b.name | +-------+---------+-------+---------+--+ | 1 | 张三 | 1 | 绿间 | | 3 | c | 3 | 青峰 | | 4 | a | 4 | 黑子 | | NULL | NULL | 9 | 红发 | +-------+---------+-------+---------+--+ #全连接 select * from a full outer join b on a.id=b.id; +-------+---------+-------+---------+--+ | a.id | a.name | b.id | b.name | +-------+---------+-------+---------+--+ | 1 | 张三 | 1 | 绿间 | | 2 | 李四 | NULL | NULL | | 3 | c | 3 | 青峰 | | 4 | a | 4 | 黑子 | | 5 | e | NULL | NULL | | 6 | r | NULL | NULL | | NULL | NULL | 9 | 红发 | +-------+---------+-------+---------+--+ #左半连接(内连接的结果中只取左边的表的数据) select * from a left semi join b on a.id = b.id; +-------+---------+--+ | a.id | a.name | +-------+---------+--+ | 1 | 张三 | | 3 | c | | 4 | a | +-------+---------+--+ select查询语句 SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_name[..join..on(a.id=b.id)] [WHERE where_condition] [GROUP BY col_list [HAVING condition]] [CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list] ] [LIMIT number] #指定map输出的数据根据id去分区,排序(cluster by等价于distribute by+sort by的效果) select id,name from my_tb cluster by(id); 自定义函数

hive内置函数

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywfpj.html