目录
3.以emp_name为动态字段数据抽取到employee表
Hive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录,每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区,这样的查询效率会提高很多,从而可以更快地查询数据。
分区可以是静态分区和动态分区
静态分区:是在表创建之后创建好的,可以手动指定分区键的值(直接给值)。静态分区通常用于数据量较为固定的场景,分区信息不会经常变更。在创建表时,可以使用partitioned by语句指定分区键,示例如下:
- CREATE TABLE employee (
- emp_id INT,
- emp_name STRING,
- emp_date STRING,
- emp_salary FLOAT
- )
- PARTITIONED BY (emp_dept STRING);
创建及插入数据:
alter table employee add partition(emp_dept='20230920');
alter table employee add partition(emp_dept='20230910');
alter table employee add partition(emp_dept='20230912');
alter table employee add partition(emp_dept='20230917');
alter table employee drop partition (emp_dept='20230910');
alter table employee drop partition (emp_dept='20230920');
alter table employee drop partition (emp_dept='20230914');
从其他表中数据插入并定义区间
insert into gh_test.employee partition(emp_dept='20230914') select * from v where emp_date='2023-09-14'
select * from gh_test.employee where emp_dept='20230914'
动态分区:
指的是分区的字段值是基于查询结果自动推断出来的(分区没有直接给值),使用Insert Select语句进行插入。
动态分区通常用于数据量较大、分区信息需要随着数据导入而变化的场景。在插入数据时,
首先开启动态分区:
# 表示开启动态分区 set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nostrict;
- insert overwrite table gh_test.employee
- partition (emp_dept) //先声明不定义值
- select v1.*,v1.emp_name from v as v1 //v1.emp_name 为分区值(可以理解为以这个emp_name字段进行了分区)
4.查看分区结果
show partition gh_test.employee
静态分区和动态分区各有其优缺点,需要根据实际情况进行选择。静态分区可以提高查询效率,但需要手动维护分区信息;动态分区可以自动维护分区信息,但对于大量数据导入可能会比较慢。