文章目录
- Hive基本操作
- Hive查看SQL解析计划
- Hive建表
- 建表1:全部使用默认建表方式
- Hive 内部表 (Managed tables)
- 指定location (这种方式也比较常用)
- formatted 查看该表的结构化数据,但并不列出表中的数据
- 将本地数据上传到HDfS上
- Hive 外部表 (External tables)
- 指定location (这种方式也比较常用)
- 将本地数据上传到HDfS上
- Hive 内部表(Managed tables)与 外部表(External tables)的区别
- 建表3:指定存储格式
- 建表4:create table xxxx as select_statement(SQL语句) (这种方式比较常用)
- 建表5:create table xxxx like table_name 只想建表,不需要加载数据
Hive基本操作
Hive查看SQL解析计划
我们都知道,hive在执行的时候会把所对应的SQL语句都会转换成MapReduce代码执行,但是具体的MR执行信息我们怎样才能看出来呢?这里就用到了explain关键字,他可详细的表示出在执行对应语句所对应的MR代码。语法格式如下;extended关键字可以更加详细的列举出代码的执行过程。
EXPLAIN [EXTENDED|DEPENDENCY|AUTHORIZATION] query
explain会把查询语句转化成stage组成的序列,主要由三方面组成:
- 查询的抽象语法树
- plane中各个stage的依赖情况
- 每个阶段的具体描述:描述具体来说就是显示出对应的操作算子和与之操作的对应的数据,例如查询select算子,filter算子,fetch算子等等。
下面来看一个具体的例子:
explain select * from students limit 10;

explain extended select * from students limit 10;

// extended 可选,可以打印更多细节
explain select a.id,a.name,a.clazz,t1.sum_score
from(select id,sum(score) as sum_scorefrom score group by id
)t1 right join (select id,name,'文科一班' as clazzfrom studentswhere clazz = '文科一班'
) a
on t1.id = a.id
order by t1.sum_score desc
limit 10;

Hive建表
格式:
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] // 指定Hive储存格式:textFile、rcFile、SequenceFile 默认为:textFile[STORED AS file_format]| STORED BY 'storage.handler.class.name' [ WITH SERDEPROPERTIES (...) ] (Note: only available starting with 0.6.0)]// 指定储存位置[LOCATION hdfs_path]// 跟外部表配合使用,比如:映射HBase表,然后可以使用HQL对hbase数据进行查询,当然速度比较慢[TBLPROPERTIES (property_name=property_value, ...)] (Note: only available starting with 0.6.0)[AS select_statement] (Note: this feature is only available starting with 0.5.0.)
建表1:全部使用默认建表方式
// 必选,指定列分隔符
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
create table students1
(id bigint,name string,age int,gender string,clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

Hive 内部表 (Managed tables)
指定location (这种方式也比较常用)
LOCATION '/input2'
指定Hive表的数据的存储位置,一般在数据已经上传到HDFS,想要直接使用,会指定Location,通常Locaion会跟外部表一起使用,内部表一般使用默认的location。
create table students_internal
(id bigint,name string,age int,gender string,clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/input2';

formatted 查看该表的结构化数据,但并不列出表中的数据
desc formatted students_internal;

将本地数据上传到HDfS上
dfs -put /usr/local/soft/data/students.txt /input2/;
select * from students_internal limit 10;

有数据了
Hive 外部表 (External tables)
指定location (这种方式也比较常用)
create external table students_external
(id bigint,name string,age int,gender string,clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/input3';

将本地数据上传到HDfS上
dfs -put /usr/local/soft/data/students.txt /input3/;
select * from students_external limit 10;

有数据了
Hive 内部表(Managed tables)与 外部表(External tables)的区别
//查看所有表
show tables;//删除内部表students_internal
drop table students_internal;
show tables;//删除外部表students_external
drop table students_external;
show tables;
当我们删除内部表的时候,将hdfs://master:9000/input2移动到回收站,目录、表、数据一起被删除。

当我们删除外部表的时候目录、表、数据并没有被删除。

可以看出,删除内部表的时候,表中的数据(HDFS上的文件)会被同表的元数据一起删除
删除外部表的时候,只会删除表的元数据,不会删除表中的数据(HDFS上的文件)
一般在公司中,使用外部表多一点,因为数据可以需要被多个程序使用,避免误删,通常外部表会结合location一起使用
外部表还可以将其他数据源中的数据 映射到 hive中,比如说:hbase,ElasticSearch…
设计外部表的初衷就是让表的元数据与数据解耦


建表3:指定存储格式
stored as rcfile;
指定储存格式为rcfile,inputFormat:RCFileInputFormat,outputFormat:RCFileOutputFormat,如果不指定,默认为textfile,注意:除textfile以外,其他的存储格式的数据都不能直接加载,需要使用从表加载的方式。
create table students2
(id bigint,name string,age int,gender string,clazz string
)
row format delimited fields terminated by ','
stored as rcfile;

建表4:create table xxxx as select_statement(SQL语句) (这种方式比较常用)
//给students1表上传数据
dfs -put /usr/local/soft/data/students.txt /user/hive/warehouse/stu_student.db/students1/;
create table students4 as select * from students1;
select * from students4 limit 10;

建表5:create table xxxx like table_name 只想建表,不需要加载数据
create table students5 like students1;
select * from students5 limit 10;

到底啦!关注靓仔学习更多的大数据知识。( •̀ ω •́ )✧