Hive Shell 命令详解

Hive服务介绍

Hive默认提供的cli(shell)服务,若是须要启动其余服务,那么须要service参数来启动其余服务,好比thrift服务、metastore服务等。能够经过命令hive --service help查看hive支持的命令。mysql

Hive Shell命令介绍
Hive的shell命令是经过${HIVE_HOME}/bin/hive文件进行控制的,经过该文件咱们能够进行hive当前会话的环境管理、也进行进行hive的表管理等操做。hive命令须要使用';'进行结束标示。经过hive -H查看帮助信息:另外从hive0.11版本开始支持--database <databasename>.linux

 

Hive Shell经常使用基本命令
Hive的Shell基本经常使用命令主要包含退出客户端、添加文件、修改/查看环境变量、执行linux命令、执行dfs命令等。命令包括:sql


quit、exit、set、add JAR[S] <filepath> <filepath>*、list JAR[S]、delete JAR[S] <filepath>*、! <linux-command>、dfs <dfs command>等。shell


除了Hive的基本命令外,其余的命令主要是DDL和DML等操做数据表的命令。apache

 

HiveQL介绍
HiveQL简称HQL,是一种相似sql的查询语言,绝大多数语法和sql相似。HQL支持基本类型和复杂类型两大类数据类型。数组


基本类型包括TINYINT(1byte), SMALLINT(2byte), INT(4byte), BIGINT(8byte), FLOAT(4byte), DOUBLE(8byte), BOOLEAN(-), STRING(2G)。app


复杂类型包括ARRAY(一组有序数组,类型必须一致), MAP(无序键值对,键值内部字段类型必须相同,并且要求key的类型为基本数据类型), STRUCT(一组字段,类型任意)。
show、describe、explain命令介绍oop



show命令的主要做用是查看database、table、function等组件的名称信息,也就是经过show命令咱们能够知道咱们的hive中有那些database;当前database中有那些table。等等。和mysql的show命令类型。
describe命令的主要做用是获取database、table、partition的具体描述信息,包括存储位置、字段类型等信息。
explain命令的主要做用是获取hql语句的执行计划,咱们能够经过分析这些执行计划来优化hql语句。优化

 


Database介绍
hive提供database的定义,database的主要做用是提供数据分割的做用,方便数据管理。命令以下:ui



建立: create (DATABASE|SCHEMA) [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_name=value,name=value....)]。
显示描述信息:describe DATABASE|SCHEMA [extended] database_name。
删除:DROP DATABASE|SCHEMA [IF EXISTS] database_name [RESTRICT|CASCADE]
使用: use database_name。


 

Hive表介绍
Hive中的表能够分为内部表(托管表)和外部表,区别在于:外部表的数据不是有hive进行管理的,也就是说当删除外部表的时候,外部表的数据不会从hdfs中删除。而内部表是又hive进行管理的,在删除表的时候,数据也会删除。通常状况下,咱们在建立外部表的时候会将表数据的存储路径定义在hive的数据仓库路径以外。
Hive建立表主要有三种方式,第一种直接使用create table命令,第二种使用create table .... AS select ....(会产生数据)。第三种使用create table tablename like exist_tablename.命令。
create table命令介绍

 

案例1:

先将data2.txt文件上传到hdfs的/customers文件夹中。


 hdfs dfs -mkdir /customers

hdfs dfs -put data2.txt /customers



案例2:
先将data3.txt文件上传到hdfs的/complex_table_test文件夹中。

 


hdfs dfs -mkdir /complex_table_test
hdfs dfs -put data2.txt /complex_table_test


 


案例3:
hive和hbase关联


create external table hive_users

(key string,

id int,

name string,

phone string)

row format serde 'org.apache.hadoop.hive.hbase.HBaseSerDe'

stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

with serdeproperties('hbase.columns.mapping'=':key,f:id,f:name,f:phone')

tblproperties('hbase.table.name'='users');


 

 

Hive shell 命令深刻使用

前置条件:
hive启动
root用户登陆 密码123456
启动mysql:service mysqld restart
使用hadoop用户登陆,启动metastore:hive --service metastore &
数据文件准备
将文档文件夹中的classes.txt和students.txt移动到linux机器和hdfs文件系统上。
命令:hdfs dfs -put ./13 /kai/
建立hive相关表准备:

 


create database kai13;
create table students(studentId int comment 'this is student id, is not null', classId int comment 'this is class id, can set to null', studentName string comment 'this is student name') row format delimited fields terminated by ',';
create table classes(classId int comment 'this is class id, is not null', className string comment 'this is class name') row format delimited fields terminated by ',';


 

1、导入数据
1. 分别导入local和hdfs的数据
a. 分别从linux机器上导入数据


load data local inpath '/home/hadoop/datas/13/classes.txt' into table classes;
load data local inpath '/home/hadoop/datas/13/students.txt' into table students;
load data local inpath '/home/hadoop/datas/13/classes.txt' overwrite into table classes;



b. 从hdfs上导入数据


load data inpath '/kai/13/students.txt' into table students;
dfs -put /home/hadoop/datas/13/students.txt /kai/13/
load data inpath '/kai/13/students.txt' overwrite into table students;



2. 导入其余表的数据(多表插入)
将学生表的学生id和classid分别导出到不一样表中,


create table test1(id int);
create table test2(id int);
from students insert into table test1 select studentid insert overwrite table test2 select distinct classid where classid is not null;



2、select语法介绍
from语法
1. 正常from:


select * from students;



2. from语句提早:


from students select *;



cte语法:
1. 获取班级号为1的学生信息:


with tmp as (select studentid as sid,classid as cid,studentname as name from students where classid=1) from tmp select *;



2. 获取总学生数、已经分配班级的学生数、未分配班级的学生数(做业1)。
分析;
总学生数:studentid的总数
分配班级的学生数:classid不为空的学生总数
未分配的学生数: classid为空的学生数
结果: 12 7 5
where & group by语法实例:
group语句只能返回对于的group列&进行聚合的value。
1. 获取学生数大于3的班级id


from students select classid where classid is not null group by classid having count(studentid) > 3;



排序语法:
1. 使用order by根据学生id倒序。


select * from students order by studentid desc;



2. 设置hive.mapred.mode为strict,而后在进行order by操做。


set hive.mapred.mode=strict;
select * from students order by studentid desc; 会出现异常
select * from students order by studentid desc limit 5;



3. 使用sort by根据学生id排序。


select * from students sort by studentid desc;



4. 设置mapreduce.job.reduces个数为两个,而后再使用sort by进行排序。


set mapreduce.job.reduces=2;
select * from students sort by studentid desc;



3、join语法
内链接语法
1. 获取学生和班级之间彻底匹配的数据。


select students.*,classes.* from classes join students on classes.classid=students.classid;
select students.*,classes.* from classes cross join students on classes.classid=students.classid;



外连接语法:
1. 获取所有学生的班级信息,若是该学生没有分配班级,那么班级信息显示为null。


select students.*, classes.* from students left join classes on students.classid = classes.classid;



2. 获取所有班级的学生信息,若是某个班级没有学生,那么学生信息显示为null。(做业2)
3. 获取所有信息,若是没有匹配数据的显示null。(做业3)
半链接:
1. 获取学生表中班级id在班级表中的全部学生信息。


sql: select students.* from students where classid in (select distinct classid from classes);
原hql: select students.* from students join classes on students.classid = classes.classid;
新hql: select students.* from students left semi join classes on students.classid=classes.classid;
mapjoin:
select /*+ mapjoin(classes) */ * from students join classes on students.classid=classes.classid;



4、子查询
1. 获取学生数最多的班级,学生的个数。
第一步:获取每一个班级的学生总数
第二步:选择学生数最多的班级学生数


from (select count(studentid) as sc from students where classid is not null group by classid) as tmp select max(sc);



2. 获取学生数最多的班级信息。(做业4)
第一步:获取每一个班级的学生总数
第二步:选择学生数最多的班级学生数
第三步:根据最多的学生数和第一步获取的表数据进行比较,获取班级信息。

5、导出数据
1. 导出表关联后的班级名称和学生名称(loca&hdfs)。(导出所有不为空的信息)
班级1,学生1


from (select classes.classname as col1, students.studentname as col2 from classes join students on classes.classid = students.classid) as tmp insert overwrite local directory '/home/hadoop/result/13/01' select col1,col2 insert overwrite directory '/kai/result/13/01/' select col1,col2 ;




格式化:


from (select classes.classname as col1, students.studentname as col2 from classes join students on classes.classid = students.classid) as tmp insert overwrite local directory '/home/hadoop/result/13/01' row format delimited fields terminated by ',' select col1,col2 ;



2. 同时分别将已经分配班级的学生和未分配班级的学生导出到不一样的文件夹中。
6、其余命令
1. 在students和classes表上建立一个视图,视图包含两列分别是:班级名称,学生名称


create view viewname as select classes.classname as cname, students.studentname as sname from classes join students on classes.classid = students.classid



2. 在linux系统中经过命令hive -f/-e将全部学生信息保存到一个文件中。
新建一个文件,文件内容为:

 


select * from students

执行:hive --database kai13 -f test.sql >> result.txt

相关文章
相关标签/搜索