Hive静态分区和动态分区

本文介绍了Hive中静态分区和动态分区的概念及应用方法。通过具体实例展示了如何创建分区表、加载数据以及使用动态分区进行数据导入。对于大数据处理场景而言,合理运用分区技术能有效提升查询效率。

一、静态分区
1、创建分区表

hive (default)> create table order_mulit_partition(
              > order_number string,
              > event_time string
              > )
              > PARTITIONED BY(event_month string, step string)
              > row format delimited fields terminated by '\t';

2、加载数据到分区表

 load data local inpath '/opt/data/order_created.txt' overwrite into table order_mulit_partition PARTITION(event_month='201405', step='1');

order_created.txt内容如下

 order_number           event_time 
10703007267488  2014-05-01 06:01:12.334+01
10101043505096  2014-05-01 07:28:12.342+01
10103043509747  2014-05-01 07:50:12.33+01
10103043501575  2014-05-01 09:27:12.33+01
10104043514061  2014-05-01 09:03:12.324+01

3、这种手动指定分区加载数据,就是常说的静态分区的使用。但是在日常工作中用的比较多的是动态分区。

二、动态分区
需求:按照不同部门作为分区导数据到目标表
以上需求如果用静态分区的话,数据量大你是不是很懵逼??所以这个需求一般采用动态分区来实现。
1、创建目标表

hive (default)> create table emp_dynamic_partition(
              > empno int, 
              > ename string, 
              > job string, 
              > mgr int, 
              > hiredate string, 
              > sal double, 
              > comm double)
              > PARTITIONED BY(deptno int)
              > row format delimited fields terminated by '\t';

2、采用动态方式加载数据到目标表
加载之前先设置一下下面的参数

hive (default)> set hive.exec.dynamic.partition.mode=nonstrict

开始加载

insert into table emp_dynamic_partition partition(deptno)
select empno , ename , job , mgr , hiredate , sal , comm, deptno from emp;

上面加载数据方式并没有指定具体的分区,只是指出了分区字段。在select最后一个字段必须跟你的分区字段,这样就会自行根据deptno的value来分区。

3、验证一下
有值

hive (default)> select * from emp_dynamic_partition;
OK
emp_dynamic_partition.empno     emp_dynamic_partition.ename     emp_dynamic_partition.job       emp_dynamic_partition.mgr       emp_dynamic_partition.hiredate     emp_dynamic_partition.sal       emp_dynamic_partition.comm      emp_dynamic_partition.deptno
7782    CLARK   MANAGER 7839    1981-6-9        2450.0  NULL    10
7839    KING    PRESIDENT       NULL    1981-11-17      5000.0  NULL    10
7934    MILLER  CLERK   7782    1982-1-23       1300.0  NULL    10
7369    SMITH   CLERK   7902    1980-12-17      800.0   NULL    20
7566    JONES   MANAGER 7839    1981-4-2        2975.0  NULL    20
7788    SCOTT   ANALYST 7566    1987-4-19       3000.0  NULL    20
7876    ADAMS   CLERK   7788    1987-5-23       1100.0  NULL    20
7902    FORD    ANALYST 7566    1981-12-3       3000.0  NULL    20
7499    ALLEN   SALESMAN        7698    1981-2-20       1600.0  300.0   30
7521    WARD    SALESMAN        7698    1981-2-22       1250.0  500.0   30
7654    MARTIN  SALESMAN        7698    1981-9-28       1250.0  1400.0  30
7698    BLAKE   MANAGER 7839    1981-5-1        2850.0  NULL    30
7844    TURNER  SALESMAN        7698    1981-9-8        1500.0  0.0     30
7900    JAMES   CLERK   7698    1981-12-3       950.0   NULL    30
8888    HIVE    PROGRAM 7839    1988-1-23       10300.0 NULL    NULL

有分区(自动分区)

hive (default)> show partitions emp_dynamic_partition;
OK
partition
deptno=10
deptno=20
deptno=30
deptno=__HIVE_DEFAULT_PARTITION__
Time taken: 0.29 seconds, Fetched: 4 row(s)

4、emp表的具体你内容如下

hive (default)> select * from emp;
OK
emp.empno       emp.ename       emp.job emp.mgr emp.hiredate    emp.sal emp.comm        emp.deptno
7369    SMITH   CLERK   7902    1980-12-17      800.0   NULL    20
7499    ALLEN   SALESMAN        7698    1981-2-20       1600.0  300.0   30
7521    WARD    SALESMAN        7698    1981-2-22       1250.0  500.0   30
7566    JONES   MANAGER 7839    1981-4-2        2975.0  NULL    20
7654    MARTIN  SALESMAN        7698    1981-9-28       1250.0  1400.0  30
7698    BLAKE   MANAGER 7839    1981-5-1        2850.0  NULL    30
7782    CLARK   MANAGER 7839    1981-6-9        2450.0  NULL    10
7788    SCOTT   ANALYST 7566    1987-4-19       3000.0  NULL    20
7839    KING    PRESIDENT       NULL    1981-11-17      5000.0  NULL    10
7844    TURNER  SALESMAN        7698    1981-9-8        1500.0  0.0     30
7876    ADAMS   CLERK   7788    1987-5-23       1100.0  NULL    20
7900    JAMES   CLERK   7698    1981-12-3       950.0   NULL    30
7902    FORD    ANALYST 7566    1981-12-3       3000.0  NULL    20
7934    MILLER  CLERK   7782    1982-1-23       1300.0  NULL    10
8888    HIVE    PROGRAM 7839    1988-1-23       10300.0 NULL    NULL
### Hive 动态分区静态分区的区别 #### 基本概念 Hive中的分区是一种优化技术,用于提高查询性能并减少扫描的数据量。根据分区值的定义方式不同,可以将分区分为静态分区动态分区。 - **静态分区**是指在插入数据时,用户需要手动指定分区的值[^3]。这意味着,在执行 `INSERT` 操作之前,开发者必须清楚地知道要写入哪个具体的分区。 - **动态分区**则是指在插入数据时,分区的值由数据本身决定,而不是通过显式的参数设置来完成。在这种情况下,用户的 SQL 查询会自动提取数据中的字段作为分区键,并将其分配到相应的分区中。 #### 主要区别 | 特性 | 静态分区 | 动态分区 | |-------------------|------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------| | 分区值来源 | 用户手动指定 | 数据本身的字段值 | | 性能影响 | 插入操作简单快速 | 可能涉及更多的计算开销,因为需要解析每条记录以确定其所属分区 | | 易用性灵活性 | 较低;适用于已知固定数量的小规模分区 | 更高;适合处理大规模未知范围内的分区 | | 配置需求 | 不需额外配置 | 需启用动态分区功能 (`SET hive.exec.dynamic.partition=true`) 并调整模式 | 为了支持更灵活的大规模数据分析场景,Hive提供了如下两个重要属性用来控制动态分区行为: ```sql -- 开启动态分区功能 SET hive.exec.dynamic.partition=true; -- 设置为非严格模式,允许全部使用动态分区而无需至少一个静态维度(推荐生产环境谨慎开启) SET hive.exec.dynamic.partition.mode=nonstrict; ``` 以上命令确保了即使所有的分组依据都来自输入数据列也可以正常工作而不报错[^2]. --- ### 使用场景分析 #### 静态分区适用场景 当目标表具有少量预设好的分区且这些分区不会频繁变化时,采用静态分区更为合适.例如按年份存储日志文件或者针对特定业务逻辑划分客户群体. 优点在于减少了不必要的复杂度以及潜在错误风险的同时还能获得较好的读取效率. 例子: 假设我们有一个销售订单表格按照地区分类存放在不同的目录下. 我们可以先创建一张带区域字段(partitioned by region) 的hive外部表然后逐批导入对应地区的原始csv文档至相应路径里去形成最终结构化视图. ```sql CREATE EXTERNAL TABLE IF NOT EXISTS sales_orders ( order_id STRING, customer_name STRING, product STRING, amount DOUBLE ) PARTITIONED BY (region STRING); ALTER TABLE sales_orders ADD PARTITION(region='North') LOCATION '/data/sales/north'; LOAD DATA INPATH '/tmp/orders_north.csv' INTO TABLE sales_orders PARTITION(region='North'); ``` 此过程完全依赖于人工干预从而保证精确无误地把各部分资料送达到正确位置上去了. #### 动态分区适用场景 对于那些每天都会新增大量新类别或时间戳关联型事件流的应用程序来说则更适合运用动态分区策略.比如监控服务器运行状态指标每隔几分钟就会产生一批新的测量数值连同当前时刻一起保存下来供后续统计报表生成之用. 此时如果还坚持沿用手动设定每一个可能遇到的时间点来做为独立子集的话无疑增加了维护成本同时也容易遗漏某些特殊情况下的异常情况无法及时捕捉反馈给相关人员采取措施加以解决. 因此借助自动化机制让系统自行判断哪些独特的组合尚未存在进而自动生成必要的扩展显得尤为重要. 实例演示如何利用动态特性简化多级嵌套层次关系管理: ```sql CREATE TABLE web_logs ( ip_address STRING, request_url STRING, response_code INT, bytes_sent BIGINT ) PARTITIONED BY (datestamp STRING, hour INT); FROM staging_weblogs s INSERT OVERWRITE TABLE web_logs PARTITION(datestamp,hour) SELECT s.ip_address, s.request_url, s.response_code, s.bytes_sent, substr(s.timestamp,0,10) as datestamp, -- 提取日期部分 cast(substr(s.timestamp,12,2) AS INT) as hour; -- 转换小时数为整数类型 ``` 这里我们将源数据集中包含完整时间戳信息的一列拆分成两段分别映射为目标表上的两级分区字段即天级别(`datestamp`) 小时级别(`hour`).整个转换过程中完全没有人为参与仅仅依靠简单的字符串截断函数即可达成目的大大降低了开发难度提高了工作效率. --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值