Hive外部表操作

hive 创建以csv为表分区的表 hive创建外部分区表_hive 创建以csv为表分区的表

 

1.  准备结构化数据文件stu.txt

在hadoop01上/export/data/hivedata下创建文件stu.txt

2.  将文件stu.txt上传至HDFS

$hadoop fs -mkdir /stu

$hadoop fs -put stu.txt /stu

3.  创建外部表

 create external table stu_ext(sno int,sname string,sex string,sage int,sdept string) row format delimited fields terminated by ',' location '/stu';

1、Hive创建内部表时,会将数据移动到数据库指向的路径;创建外部表时仅记录数据所在的路径,不会对数据的位置做任何改变。

2、在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

分区表是按照属性在文件夹层面给文件更好的管理,实际上就是对应一个HDFS文件系统上的独立文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。

普通分区和动态分区。

单分区和多分区

Hive分区表操作

1.  准备结构化数据文件user_p.txt

在hadoop01上/export/data/hivedata下创建文件stu.txt

2.  创建Hive分区表

hive> create table t_user_p(id int, name string)

partitioned by (country string)

row format delimited fields terminated by ',';

3.  加载数据

语法格式:

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE]

INTO TABLE   table_name PARTITION (partcol1=val1,partcol2=val2……)

hive> load data local inpath '/export/data/hivedata/user_p.txt' into table t_user_p partition(country='USA');

4.  新增分区

hive> ALTER TABLE t_user_p  ADD PARTITION (country='China') location  '/user/hive/warehouse/itcast.db/t_user_p/country=China';

5.  修改分区

hive> ALTER TABLE t_user_p  PARTITION (country='China') RENAME TO PARTITION (country='Japan');

6.  删除分区

hive> ALTER TABLE t_user_p  DROP IF EXISTS PARTITION (country='Japan');

分区字段不能与已存在字段重复,且分区字段是一个虚拟的字段,它不存放任何数据,该数据来源于装载分区表时所指定的数据文件。

Hive动态分区

  在默认情况下,我们加载数据时,需要手动的设置分区字段,并且针对一个分区就要写一个插入语句。如果源数据量很大时(例如,现有许多日志文件,要求按照日期作为分区字段,在插入数据的时候无法手动的添加分区),就可以利用Hive提供的动态分区,可以简化插入数据时的繁琐操作。

Hive动态分区

1.  开启动态分区功能

hive> set hive.exec.dynamic.partition=true;

hive> set hive.exec.dynamic.partition.mode=nonstrict;

2.  实现动态分区

hive> insert overwrite table table_name

partition (partcol1[=val1], partcol2[=val2] ...)

select_statement FROM from_statement

Hive动态分区

1.  创建原始表

hive> create table dynamic_partition_table(day string,ip string) row format delimited fields terminated by ',';

2.  加载数据文件至原始表

hive> load data local inpath '/export/data/hivedata/dynamic_partition_table.txt' into table dynamic_partition_table;

3.  创建目标表

hive>create table d_p_t(ip string) partitioned by (month string,day string);

4.  动态插入

hive>insert overwrite table d_p_t partition(month,day) select ip,substr(day,1,7) as month,day from dynamic_partition_table;

INFO  : Number of reduce tasks is set to 0 since there's no reduce operator

5.  查看目标表的分区数据

hive> show partitions d_p_t;

动态分区不允许主分区采用动态列而副分区采用静态列,这样导致所有的主分区都创建副分区所定义的分区。