hive常用操作指南

数据库操作

创建数据库:

CREATE DATABASE db_hive;

高级:

CREATE DATABASE db_hive [if not exists] db_hive

##显示数据库:

SHOW DATABASES;

##查看数据库信息

DESC DATABASE db_hive;

##删除数据库:

DROP DATABASE IF EXISTS db_hive;

##进入数据库:

USE db_hive;

表操作

创建表:
在这里插入图片描述
##内部表(管理表):

CREATE TABLE db_hive.employee(             //表employee前面加上数据库名db_hive避免错误
> eid int,name string,salary string,destination string)  
> PARTITIONED BY (dt string, country string)    //添加分区,可选项
> COMMENT 'Employee details'                    //注释
> ROW FORMAT DELIMITED        //行格式字段,如字段终止符,行终止符,保存的文件类型
> FIELDS TERMINATED BY ' '      //指定字段分隔符是一个空格 ,也可以'\t'、'#'、','等 ,默认为'\001',隐藏分割符                            
> LINES TERMINATED BY '\n'     //指定一条记录分隔符
//> COLLECTION ITEMS TERMINATED BY ':'    //一个字段各个item的分隔符,如字段chen:30,配合array使用
> STORED AS TEXTFILE;

##外部表:(使用多)

CREATE EXTERNAL TABLE db_hive.employee(eid int,name string,salary string,destination string) 
> PARTITIONED BY (dt string, country string)    //添加分区,可选项
> COMMENT 'Employee details'                    //注释
> ROW FORMAT DELIMITED        //行格式字段,如字段终止符,行终止符,保存的文件类型
> FIELDS TERMINATED BY ' '      //指定字段分隔符是一个空格 ,也可以'\t'、'#'等                         
> LINES TERMINATED BY '\n'     //指定一条记录分隔符
> STORED AS TEXTFILE                  //存储格式可选ORC /PARQUET
> LOCATION '/tmp/test-hive';    //自定义表格数据存放在hdfs位置

观察一下创建表和外部表的区别,会发现创建外部表多了EXTERNAL关键字以及指定了表对应存放文件夹LOCATION ‘/tmp/test-hive’。

【注】在删除表的时候,内部表将删除表的元数据和数据文件;而删除外部表的时候,仅仅删除外部表的元数据(元数据存储在mysql中),不删除数据文件(/tmp/test-hive下面仍存在数据文件)

通过脚本文件执行表操作(企业常用)
通过将表操作(如创建表、加载数据等)写入到文件中,保存为XXX.sql

扫描二维码关注公众号,回复: 4376665 查看本文章
方式一:bin/hive -f /home/hadoop/data/XXX.sql
方式二:进入到hive,执行:
0: jdbc:hive2://master:10000> source /home/hadoop/data/XXX.sql

##创建同类型的表:

CREATE TABLE db_hive1.employee LIKE db_hive.employee;    //在db_hive1数据库下创建一张,与db_hive数据库下employee表类型一样的表

###查询同类型表的信息,插入到新表:

INSERT INTO TABLE db_hive1.employee SELECT * FROM db_hive.employee;

##查看表:

SHOW TABLES;

##查看表结构:

desc db_hive.employee;

##查看表在hdfs上的存储位置:

SHOW CREATE TABLE db_hive.employee;

在这里插入图片描述
##查看hdfs中的内容:

hive> dfs -ls /user/hive/warehouse/userdb.db/employee_bucket;

##查看文件大小:

hive> dfs -du -h /user/hive/warehouse/db_hive_test.db;

##手动修改表存储位置:
修改${HIVE_HOME}/conf/hive-site.xml配置文件的hive.metastore.warehouse.dir属性
##修改表:

ALTER TABLE name RENAME TO new_name;
ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...]);
ALTER TABLE name DROP [COLUMN] column_name;
ALTER TABLE name CHANGE column_name new_name new_type;
ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...]);

如:ALTER TABLE employee RENAME TO emp;

##删除表:

DROP TABLE IF EXISTS db_hive.employee;

##删除表内所有数据,保留表定义

TRUNCATE TABLE db_hive.employee;

4、加载数据
数据文件可以从HDFS或者本地操作系统加载到表中,如果加载HDFS文件使用LOAD DATA INPATH,而加载本地操作系统文件使用LOAD DATA LOCAL INPATH命令。
数据文件在本地操作系统将复制到表对应的目录中,而数据文件在HDFS中,数据文件将移动到表对应的目录中,原来的路径将不存在该文件
##加载本地数据到hive表:

> LOAD DATA LOCAL INPATH '/home/hadoop/hive-test/sample.txt'
> [OVERWRITE] INTO TABLE db_hive.employee
> PARTITION (dt = '2018-4-5', country = 'china');      //可选项
 LOCAL是标识符指定本地路径。它是可选的。
 OVERWRITE 是可选的,覆盖表中的数据。
 PARTITION 选择分区

##加载HDFS数据(/tmp/hive-test/sample.txt)到hive表:

LOAD DATA  INPATH '/tmp/hive-test/sample.txt'
> [OVERWRITE] INTO TABLE db_hive.employee;

##查看表的分区:

SHOW PARTITIONS db_hive.employee;

5、导出数据
##将查询结果导出到本地/home/hadoop/hive-exp目录下面:

> INSERT [OVERWRITE] LOCAL DIRECTORY '/home/hadoop/hive-exp'
> SELECT * FROM db_hive.employee;

方式二:
进入到hive目录,执行:

bin/hive -e "SELECT * FROM db_hive.employee;" > /home/hadoop/hive-exp/result.txt

6、Import和Export
Import:导入,将外部数据导入Hive表中

IMPORT TABLE db_hive.employee FROM 'source_path';   //source_path指的是HDFS上的数据位置

Export:导出,将hive表中的数据(包括元数据)导出到外部(实现备份)

EXPORT TABLE db_hive.employee TO 'export_target_path';  //export_target_path指的是HDFS上的备份路径

7、order by 、sort by、distribute by、cluster by
order by:对输入做全局排序,因此只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。

SELECT * FROM db_hive.employee ORDER BY empID desc;     //按照empID降序排列

sort by:不是全局排序,其在数据进入reducer前完成排序。因此,如果用sort by进行排序,并且设置mapreduce.job.reduces>1,则sort by只保证每个reducer的输出有序,不保证全局有序。

set mapreduce.job.reduces = 3;   //设置reduce数目

INSERT [OVERWRITE] LOCAL DIRECTORY '/home/hadoop/hive-exp'
> SELECT * FROM db_hive.employee 
> SORT BY empID asc;        //在本地会生成3个reduce结果文件,每个文件按照empID升序排列

distribute by:类似于MapReduce中分区partation,对数据进行分区,结合sort by进行使用

INSERT [OVERWRITE] LOCAL DIRECTORY '/home/hadoop/hive-exp'
> SELECT * FROM db_hive.employee 
> DISTRIBUTE BY deptNum       //按照部门进行分区
> SORT BY empID asc;        //在本地会根据部门生成结果文件,每个文件按照empID升序排列

cluster by:Cluster by 除了具有distribute by的功能外,还会对该字段进行排序。当distribute by和sort by 字段相同时,可以使用cluster by 代替;

8、function函数
###查看系统自带的函数:

show functions;

###查看函数split的具体用法:

desc function extended substring;

###在线测试一下效果

select substring('20150405',5,2) month ;

##提取employee表中Name字段的子内容到sub_name

select substring(Name,2,1) sub_name from db_hive.employee  limit 5;

##高级使用:统计time_local(201804051206)中固定小时的记录个数

hive> SELECT t.hour COUNT(*) cnt FROM
hive> (SELECT SUBSTRING(time_local,9,2) hour FROM  employee_hour) t
hive> GROUP BY t.hour 
hive> ORDER BY cnt desc;

猜你喜欢

转载自blog.csdn.net/weixin_41907511/article/details/84796870