Hive之分区表

Hive之分区表


文章目录

  • Hive之分区表
    • 写在前面
    • 分区表
      • 分区表基本操作
        • 引入分区表
        • 创建分区表语法
        • 加载数据到分区表中
        • 查询分区表中数据
        • 增加分区
        • 删除分区
        • 查看分区表有多少分区
        • 查看分区表结构
      • 二级分区
        • 正常的加载数据
        • 分区表和数据产生关联
      • 动态分区
        • 开启动态分区参数设置
        • 案例实操


写在前面

  • Linux版本:CentOS7.5
  • Hive版本:Hive-3.1.2

分区表

分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。

分区表基本操作

引入分区表

需要根据日期对日志进行管理, 通过部门信息模拟

dept_20200401.log
dept_20200402.log
dept_20200403.log
……
创建分区表语法
hive (default)> create table dept_partition(
deptno int, dname string, loc string
)
partitioned by (day string)
row format delimited fields terminated by '\t';

注意:分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。

加载数据到分区表中

(1)数据准备

dept_20200401.log

10	ACCOUNTING	1700
20	RESEARCH	1800
dept_20200402.log
30	SALES	1900
40	OPERATIONS	1700
dept_20200403.log
50	TEST	2000
60	DEV	1900

(2)加载数据

hive (default)> load data local inpath '/export/server/hive-3.1.2/datas/dept_20200401.log' into table dept_partition partition(day='20200401');
hive (default)> load data local inpath '/export/server/hive-3.1.2/datas/dept_20200402.log' into table dept_partition partition(day='20200402');
hive (default)> load data local inpath '/export/server/hive-3.1.2/datas/dept_20200403.log' into table dept_partition partition(day='20200403');

注意:分区表加载数据时,必须指定分区

  • HDFS Web段查看分区

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Rf6nz3l-1682061151347)(assets/01.png)]

  • Hive查询分区

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sOxSbXvR-1682061151348)(assets/02.png)]

查询分区表中数据
  • 单分区查询
hive (default)> select * from dept_partition where day='20200401';
  • 多分区联合查询
hive (default)> select * from dept_partition where day='20200401'
              union
              select
<think>好的,用户想了解如何在Hive中创建分区表。首先,我需要回忆Hive分区表的相关知识。记得分区表是通过将数据按某个或几个字段的值分成不同的目录存储,这样可以提高查询效率,尤其是在处理大数据时,避免全表扫描。 根据用户提供的引用内容,特别是引用[2]中的语法结构,创建分区表需要在CREATE TABLE语句中使用PARTITIONED BY子句。分区字段在表中并不作为实际的数据列存在,而是作为目录结构。比如,按日期分区的话,每个日期会生成一个子文件夹。 接下来,我需要考虑如何给出一个具体的示例。比如,用户可能想知道如何按地区(如city)和日期(如dt)进行分区。这里要注意分区的顺序,先按city再按dt的话,目录结构会是city=beijing/dt=20230101这样的形式。 然后,用户可能需要插入数据到分区表的例子。这时候需要使用INSERT INTO语句,并指定分区字段的值。需要注意的是,动态分区和静态分区的区别。示例中使用的是静态分区,直接指定值,而动态分区则需要设置相关参数,比如hive.exec.dynamic.partition.mode=nonstrict。 还要提到分区的优势,比如提升查询性能和管理数据。引用[3]提到分区在存储层面表现为子文件夹,支持多重分区,所以例子中用了两个分区字段来说明这点。 另外,用户可能遇到的问题,比如分区字段不能与表字段重复,或者分区字段的数据类型需要正确指定。这些注意事项应该在步骤中说明,避免常见错误。 最后,生成相关问题时要围绕分区表的使用场景、管理操作、优化方法等方面展开,帮助用户进一步学习。比如如何添加新分区、分区表的性能优化、动态分区的使用等。 总结一下,回答的结构应该是先介绍概念,然后给出语法和示例,接着说明数据插入方法,最后注意事项和相关问题。需要确保所有步骤符合Hive的语法规范,并且引用提供的参考资料来支持内容。</think>### Hive 分区表创建教程 在 Hive 中创建分区表是通过`PARTITIONED BY`子句实现的,其核心作用是将数据按指定字段值分类存储。以下是具体操作步骤: #### 1. 基础语法 ```sql CREATE TABLE 表名 ( 列名1 数据类型, 列名2 数据类型, ... ) PARTITIONED BY (分区字段1 数据类型, 分区字段2 数据类型) STORED AS ORC; -- 可选存储格式 ``` *注意:分区字段不能与表中已有字段重复*[^2] #### 2. 创建示例 创建按城市和日期分区的订单表: ```sql CREATE TABLE orders ( order_id STRING, amount DOUBLE, customer_id STRING ) PARTITIONED BY (city STRING, dt STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; ``` 此时HDFS中会生成路径结构:`/user/hive/warehouse/orders/city=北京/dt=20230101`[^3] #### 3. 数据加载 静态分区插入示例: ```sql INSERT INTO TABLE orders PARTITION (city='北京', dt='20230101') SELECT order_id, amount, customer_id FROM temp_orders; ``` #### 4. 分区优势 - 查询优化:执行`WHERE city='北京'`时自动跳过无关分区 - 数据管理:可单独删除/添加分区(`ALTER TABLE orders DROP PARTITION (dt='20230101')`) - 存储优化:支持按分区设置不同存储策略 #### 5. 注意事项 - 分区字段会作为虚拟列出现在表结构中 - 建议分区层级不超过3级 - 避免产生过多小分区(建议每个分区≥1GB) - 使用`SHOW PARTITIONS orders;`查看分区信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值