Hive外部表操作
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;
动态分区不允许主分区采用动态列而副分区采用静态列,这样导致所有的主分区都创建副分区所定义的分区。