文章目录
1、Hive在HDFS上的默认存储路径
Hive的数据都是存储在HDFS上的,默认有一个根目录,在hive-site.xml中,由参数hive.metastore.warehouse.dir指定。默认值为/user/hive/warehouse.
2、hive中的数据库
查看数据库
show databases;
切换数据库(如切换到数据库kaidy)
use kaidy;
创建数据库
语法:CREATE DATABASE|SCHEMA [IF NOT EXISTS]
删除数据库
#Hive中的数据库在HDFS上的存储路径为:
${hive.metastore.warehouse.dir}/databasename.db
比如,名为kaidy的数据库存储路径为:
/user/hive/warehouse/kaidy.db
3、hive中的表
查看数据库中所有的表
show tables;
创建表
语法CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.] table_name
[(col_name data_type [COMMENT col_comment], …)]
[COMMENT table_comment]
[ROW FORMAT row_format]
[STORED AS file_format]
删除表
语法DROP TABLE [IF EXISTS] table_name;
#Hive中的表在HDFS上的存储路径为:
${hive.metastore.warehouse.dir}/databasename.db/tablename/
查看已创建的表信息
DESCRIBE EXTENDED db_name.table_name
–FORMATTED关键字替代EXTENDED能提供更加可读和冗长的输出信息
DESCRIBE mydb.employee.salary
–如果只想查看某一列的信息,则使用EXTENDED也不会提供更多的信息
输出创建指定表或者视图的语句
语法:SHOW CREATE TABLE ([db_name.]table_name|view_name)
列出表所有属性
语法:SHOW TBLPROPERTIES table_name
查看表中的全部数据
select * from table_name;
查看表中的记录数
select count(*) from table_name;
查看表中前5条数据
select * from table_name limit 5;
外部表和内部表
Hive中的表分为内部表(MANAGED_TABLE)和外部表(EXTERNAL_TABLE)。
内部表和外部表最大的区别:
内部表DROP时候会删除HDFS上的数据;
外部表DROP时候不会删除HDFS上的数据;
内部表适用场景:
Hive中间表、结果表、一般不需要从外部(如本地文件、HDFS上load数据)的情况。
外部表适用场景:
源表,需要定期将外部数据映射到表中。
使用场景:
每天将收集到的网站日志定期流入HDFS文本文件,一天一个目录;
在Hive中建立外部表作为源表,通过添加分区的方式,将每天HDFS上的原始日志映射到外部表的天分区中;
在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。
4、分区(partition)
建立分区表
CREATE TABLE IF NOT EXISTS alarm3 ( eid int, name String, salary Float, destination String, month String) COMMENT ‘Alarm details’ partitioned by (p_province String) clustered by (eid) into 8 buckets STORED AS orc TBLPROPERTIES (‘transactional’=‘true’);
查看分区信息
语法:SHOW PARTITIONS table_name [PARTITION(partition_desc)]
partition
p_date=2019-01-01/p_province=beijingshi
p_date=2019-02-01/p_province=beijingshi
p_date=2019-02-01/p_province=tianjinshi
p_date=2019-02-01/p_province=xinjiangweiwuerzuzizh
p_date=2019-02-01/p_province=zhejiangsheng
指定分区查看数据
##基于单个分区查询例子:
select * from table_name where p_date=‘2019-02-01’ limit 100;
##基于两级分区查询例子:
select * from table_name where concat_ws(’,’,p_date,p_province)=‘2019-02-01,beijingshi’ limit 100;
删除指定分区
alter table table_name drop partition(p_province=‘anhuisheng’);
批量删除分区
alter table table_name drop if exists
partition(dt=‘20180401’),
partition(dt=‘20180402’),
partition(dt=‘20180403’),
partition(dt=‘20180404’);
5、静态分区和动态分区
动态分区设置方法
set hive.exec.dynamic.partition=true; 这个属性默认值是true,就是开启动态分区
set hive.exec.dynamic.partition.mode=nonstrict; 这个属性默认值是strict,就是要求分区字段必须有一个是静态的分区值,随后会讲到,当前设置为nonstrict,那么可以全部动态分区
set hive.exec.max.dynamic.partitions=100000;能被每个mapper或者reducer创建的最大动态分区的数目,如果一个mapper或者reducer试图创建多余这个值的动态分区数据,会引发错误
set hive.exec.max.dynamic.partitions.pernode=100000;被一条带有动态分区的SQL语句所能创建的动态分区总量,如果超出限制会报出错误
set hive.exec.max.created.files=100000;全局能被创建文件数据的最大值,专门有一个hadoop计数器来跟踪该值,如果超出会报错
可以直接把上述设置项在控制台中运行一下,以后就可以自由动态分区了。
多个分区字段时,可以实现半自动分区(部分字段静态分区,注意静态分区字段要在动态分区字段前面)
6、分桶(bucket)
#创建表分桶示例:
CREATE TABLE IF NOT EXISTS alarm2 ( eid int, name String, salary Float, destination String, month String, province String) COMMENT ‘Alarm details’ clustered by (eid) into 8 buckets STORED AS orc TBLPROPERTIES (‘transactional’=‘true’);