Hive命令-分区篇

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive命令-分区篇相关的知识,希望对你有一定的参考价值。

参考技术A 语法:

假设我们有一个表叫employee ,拥有如 Id, Name, Salary, Designation, Dept, 和 yoj (即加盟年份)字段。

假设需要检索所有在2017年加入,查询搜索整个表所需的信息员工的详细信息。

但是,如果用年份分区雇员数据并将其存储在一个单独的文件,它减少了查询处理时间。

例如:/employee/employeedata/2017/file2017

语法:

例如:

语法:

例如:

语法:

例如:

Hive篇:Hive分区表常用语法汇总


前言:


如果对分区表了如指掌,那么非分区表的语法就简单多了,只需将 PARTITION 相关字段去掉就可以了。


1. 创建hive分区表


//不指定LOCATION


CREATE EXTERNAL TABLE 

IF NOT EXISTS hive_partition_01(

ROWKEY STRING,

YEAR INT,

MONTH INT,

DAY INT,

HOUR INT,

MINUTE INT)

PARTITIONED BY (AGE INT) 

ROW FORMAT DELIMITED FIELDS 

TERMINATED BY ','  STORED AS TEXTFILE;    


注:不指定LOCATION,默认为/user/hive/warehouse/*.db/table_name


//指定LOCATION


CREATE EXTERNAL TABLE 

IF NOT EXISTS hive_partition_02(

ROWKEY STRING,

YEAR INT,

MONTH INT,

DAY INT,

HOUR INT,

MINUTE INT)

PARTITIONED BY (AGE INT) 

ROW FORMAT DELIMITED FIELDS 

TERMINATED BY ','  

STORED AS TEXTFILE 

LOCATION 'hdfs://master:8020/user/hive/warehouse/hive_hbase.db/hive_partition_01' ;


注:创建指定数据路径的外部分区表要添加分区后才能查到数据,可在hive命令行执行修复命令: msck repair table tablename。 


2. 创建分区


ALTER TABLE hive_partition_01 ADD PARTITION(AGE= 1998);  


注:创建分区后 HDFS 增加目录 age=1998


3. 删除分区


ALTER TABLE hive_partition_01 DROP IF EXISTS PARTITION(age =1998);   

 

注:外部表删除分区后HDFS分区数据不会被删除


4. 向HIVE表加载数据(四种方式)


4.1 从HDFS上导入数据到Hive表


//加载某个目录下所有数据,只适合非分区表


LOAD DATA INPATH '/emp.txt' OVERWRITE INTO TABLE hive_01; 


//INTO 追加写


LOAD DATA INPATH '/emp.txt' INTO TABLE hive_partition_01 PARTITION(AGE=1998);  


注:从HDFS加载数据,加载后emp.txt文件消失,属于copy操作


//OVERWRITE INTO 覆盖写


LOAD DATA INPATH '/emp.txt' OVERWRITE INTO TABLE hive_partition_01 PARTITION(AGE=1998);    


LOAD DATA INPATH '/emp.txt' [OVERWRITE] INTO TABLE hive_partition_01 PARTITION(AGE=1999); 

  

注:执行该语句若分区不存在会自动创建


4.2 从本地文件系统中导入数据到Hive表


// INTO 追加写


LOAD DATA LOCAL INPATH '/home/emp.txt' INTO TABLE hive_partition_01 PARTITION(AGE=1999);  


// OVERWRITE INTO 覆盖写 


LOAD DATA LOCAL INPATH '/home/emp.txt' OVERWRITE INTO TABLE hive_partition_01 PARTITION(AGE=1999);    


4.3 从别的表中查询数据并导入到Hive表中


// INTO 追加写


insert INTO table hive_partition_01 partition (AGE=1999) select rowkey, year, month ,day , hour , minute from hive_partition_02;


注:hive_partition_02 表 select 的字段必须与 hive_partition_01 表对应,此条语句会执行MapReduce任务


//OVERWRITE 覆盖写


insert OVERWRITE table hive_partition_01 partition (AGE=1999) select rowkey, year, month ,day , hour , minute from hive_partition_02;


注:HDFS分区目录下的文件都会被覆盖写


4.4 创建表时从别的表查询数据到所创建的表


create table hive_partition_03 as select rowkey, year, month from hive_partition_01;   


注:此条语句会执行MapReduce任务,可select部分字段 


4.5 支持多表插入


from hive_partition_01

    > insert into table hive_partition_02

    > partition(age=1998)

    > select rowkey, year, month ,day , hour , minute

    > insert into table hive_partition_03

    > select rowkey, year, month;


注:向HDFS目录相同路径下上传相同文件,文件名会添加copy字样。如下:


/user/hive/warehouse/hive_hbase.db/hive_partition_01/age=1999/emp.txt

/user/hive/warehouse/hive_hbase.db/hive_partition_01/age=1999/emp_copy_1.txt


注:hive 字段不区分大小写





将最好的祝福送给正在阅读的你,感恩!

以上是关于Hive命令-分区篇的主要内容,如果未能解决你的问题,请参考以下文章

如何用sqoop将hive分区表信息导入到mysql命令

hive创建分区 9870查询不到

在 hive 的分区级别添加列

Hive:如何显示表的所有分区?

hive中怎样删除分区

hive外部表分区