一、内部表

hive 临时表 作为 把查找的数据 hive 临时表用法_hive

hive默认创建的是内部表,内部表也称为管理表或临时表(managed table),hive控制着整个表的生命周期,当删除一张表的时候表中的数据也会相应删除。

内部表的存储位置是hive.metastore.warehouse.dir(默认是:/user/hive/warehouse)

缺点:在实际开发中,内部表不方便和其他工作共享数据,hive在设计之初就不允许共享管理表中的数据,hive提供了外部表。

操作

1、创建一个数据库:create database train;
2、使用train数据库:use train;
3、在数据库train中创建一个person表:

create table person(
 id int,
name string,
age int)
row format delimited fields terminated by ',';

4、查看数据库hive的信息: desc database train;
5、上传数据到创建的person表中: 

dfs -put /opt/person.txt /user/hive/warehouse/train.db/person;
6、显示当前数据库:set hive.cli.print.current.db=true;
查看表:select * from person;
7、显示表的行头信息:set hive.cli.print.header=true;
8、查看表: select * from person;

hive 临时表 作为 把查找的数据 hive 临时表用法_大数据_02

hive 临时表 作为 把查找的数据 hive 临时表用法_hadoop_03

hive 临时表 作为 把查找的数据 hive 临时表用法_外部表_04

二、外部表

hive 临时表 作为 把查找的数据 hive 临时表用法_hadoop_05

外部表中的数据生命周期不受hive控制,而且可以与其他外部表进行数据共享。

外部表数据的存储位置由自己制定。

Hive中内表与外部表的区别:

1.在导入数据到外部表,数据并没有移动到自己的数据仓库目录下(如果指定了location的话),也就是说外部表中的数据并不是由它自己来管理的,而内部表则不一样;

2.在删除内部表的时候,hive将会把属于表的元数据和数据全部删除;而删除外部表的时候,hive仅仅删除外部表的元数据,数据是不会删除的;

3.在创建内部表或外部表时加上location效果是一样的,只不过表目录的位置不同而已,加上partition用法也一样,只不过表目录下会有分区目录而已,load data local inpath 直接把本地文件系统的数据上传到HDFS上,有location上传到location指定的位置上,没有的话上传到hive默认配置的数据仓库中。

4.对内部表的修改会将修改直接同步给元数据,而对外部表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name)

 操作

 create external table external_table(

id int,

name string,

 age int)

row format delimited fields terminated by ','

location '/user/root/external/external_person';

dfs -put /opt/person.txt /user/root/external/external_person;

select * from external_table;

show tables;

hive 临时表 作为 把查找的数据 hive 临时表用法_外部表_06

hive 临时表 作为 把查找的数据 hive 临时表用法_hive_07

hive 临时表 作为 把查找的数据 hive 临时表用法_外部表_08

hive 临时表 作为 把查找的数据 hive 临时表用法_hive 临时表 作为 把查找的数据_09

在删除内部表的时候,hive将会把属于表的元数据和数据全部删除;而删除外部表的时候,hive仅仅删除外部表的元数据,数据是不会删除的;

hive 临时表 作为 把查找的数据 hive 临时表用法_hive_10

hive 临时表 作为 把查找的数据 hive 临时表用法_大数据_11

 

 三、分区表

 在创建分区表之前要先创建一个数据库存放数据(创建了一个taitan的数据库和tidanic的表,并上传了数据) 

hive 临时表 作为 把查找的数据 hive 临时表用法_hive_12

hive 临时表 作为 把查找的数据 hive 临时表用法_hadoop_13

hive 临时表 作为 把查找的数据 hive 临时表用法_外部表_14

操作:

 create database taitan;

use taitan;

set hive.cli.print.current.db=true;

create table tidanic(

passengerId int,

survived int,

pclass int,

name string,

sex string,

age int,

sibsp int,

parch int,

ticket string,

fare double,

cabin string,

embarked string)

row format delimited fields terminated by ',';

dfs -put /opt/train.csv /user/hive/warehouse/taitan.db/tidanic;

select * from tidanic;

drop table tidanic;

create table tidanic1(

passengerid int,

survived int,

pclass int,

name string,

sex string,

age int,

sibsp int,

parch int,

ticket string,

fare double,

cabin string,

embarked string)

row format delimited fields terminated by ',';

上传数据:dfs -put /opt/train.csv /user/hive/warehouse/taitan.db/tidanic1;

 静态分区表的创建:

hive 临时表 作为 把查找的数据 hive 临时表用法_hive_15

hive 临时表 作为 把查找的数据 hive 临时表用法_大数据_16

create table tidanic1_part(

passengerid int,

survived int,

pclass int,

name string)

partitioned by(gender string)

row format delimited fields terminated by ',';

insert overwrite table tidanic1_part partition (gender='female') select passengerid,survived,pclass,name from tidanic1 where sex='female';

insert overwrite table tidanic1_part partition (gender='male') select passengerid,survived,pclass,name from tidanic1 where sex='male';

错误:

hive 临时表 作为 把查找的数据 hive 临时表用法_大数据_17

 可以设置hive成本地模式来执行任务试试:

 set hive.exec.mode.local.auto=true;

hive 临时表 作为 把查找的数据 hive 临时表用法_hive 临时表 作为 把查找的数据_18

hive 临时表 作为 把查找的数据 hive 临时表用法_hive 临时表 作为 把查找的数据_19

hive 临时表 作为 把查找的数据 hive 临时表用法_hive 临时表 作为 把查找的数据_20

hive 临时表 作为 把查找的数据 hive 临时表用法_外部表_21

 三、 动态分区表

hive 临时表 作为 把查找的数据 hive 临时表用法_hive_22

hive 临时表 作为 把查找的数据 hive 临时表用法_hive_23

操作:

hive 临时表 作为 把查找的数据 hive 临时表用法_hive_24

hive (taitan)> set hive.exec.dynamic.partition=true;

hive (taitan)> set hive.exec.dynamic.partition.mode=nostrict;

hive (taitan)>create table tidanic_dynamic_part(

passengerid int,

survived int,

name string)

 partitioned by(passengerclass string)

row format delimited fields terminated by ',';


hive (taitan)> set hive.exec.mode.local.auto=true;

hive (taitan)> insert overwrite table tidanic_dynamic_part partition(passengerclass) select passengerid,survived,name,pclass from tidanic;

hive 临时表 作为 把查找的数据 hive 临时表用法_hadoop_25

hive 临时表 作为 把查找的数据 hive 临时表用法_hadoop_26