Hive数仓操纵(七)

打印 上一主题 下一主题

主题 862|帖子 862|积分 2586

一、 Hive动态分区表

1. 动态分区与静态分区的区别


  • 分区界说

    • 静态分区:在插入数据时,必要手动指定分区字段的值。
    • 动态分区:分区字段的值是根据数据中的某个字段自动生成的,用户只需指定分区字段的范例。

  • 数据加载方式

    • 静态分区:可以通过 LOAD DATA 和 INSERT ... SELECT 加载数据。
    • 动态分区:只能通过 INSERT ... SELECT 加载数据。

  • 查询要求

    • 静态分区:在 INSERT ... SELECT 中,SELECT 和 WHERE 子句中不必要包含分区字段。
    • 动态分区:在 INSERT ... SELECT 中,必须查询出分区字段的值,并且这些字段必要放在 SELECT 和 WHERE 子句之间的末了。

2. 动态分区设置


  • 开启动态分区
    1. SET hive.exec.dynamic.partition = true;
    复制代码
  • 设置动态分区模式
    动态分区有两种模式:

    • strict: 必要与静态分区一起利用,不设置nonstrict的情况下创建动态分区表的同时必必要指定一个静态分区。
      1. -- 示例:
      2. INSERT INTO TABLE students_pt PARTITION(dt='anhui', pt) SELECT ..., pt FROM students;
      复制代码
    • nonstrict: 允许单独利用动态分区。
      1. SET hive.exec.dynamic.partition.mode = nonstrict;
      复制代码

  • 设置最大分区数量
    可以根据业务需求调整支持的最大分区数量。例如,设置为1000:
    1. SET hive.exec.max.dynamic.partitions.pernode = 1000;
    复制代码
示例

1. 动态分区示例

  1. SET hive.exec.dynamic.partition = true;
  2. SET hive.exec.dynamic.partition.mode = nonstrict;
  3. CREATE TABLE student_info_dynamic (  id INT,  name STRING,  sex STRING,  age INT)PARTITIONED BY (year STRING)ROW FORMAT DELIMITEDFIELDS TERMINATED BY ',';INSERT INTO TABLE student_info_dynamicPARTITION (year)SELECT id, name, sex, age, year FROM source_table;
复制代码
2. 静态加动态分区示例

  1. SET hive.exec.dynamic.partition = true;
  2. SET hive.exec.dynamic.partition.mode = nonstrict;
  3. CREATE TABLE student_info_static_dynamic (  id INT,  name STRING,  sex STRING)PARTITIONED BY (year STRING, month STRING)ROW FORMAT DELIMITEDFIELDS TERMINATED BY ',';INSERT INTO TABLE student_info_static_dynamicPARTITION (year = '2023', month)SELECT id, name, sex, month FROM source_table;
复制代码
3. 多个动态分区示例

  1. SET hive.exec.dynamic.partition = true;
  2. SET hive.exec.dynamic.partition.mode = nonstrict;
  3. CREATE TABLE student_info_multi_dynamic (  id INT,  name STRING)PARTITIONED BY (year STRING, month STRING)ROW FORMAT DELIMITEDFIELDS TERMINATED BY ',';INSERT INTO TABLE student_info_multi_dynamicPARTITION (year, month)SELECT id, name, year, month FROM source_table;
复制代码

二、 Hive外部分区表

假设在 HDFS 上已经存在日志目录,其结构如下:
  1. hadoop fs -put log1.txt /logs/20210510
  2. hadoop fs -put log2.txt /logs/20210511
  3. hadoop fs -put log3.txt /logs/20210512
复制代码
1. 创建外部分区表

  1. CREATE EXTERNAL TABLE ext_logs_p (
  2.   id INT,
  3.   name STRING,
  4.   operate STRING
  5. )
  6. PARTITIONED BY (date_time STRING)
  7. ROW FORMAT DELIMITED
  8. FIELDS TERMINATED BY ','
  9. LOCATION '/logs';
复制代码
2. 挂载已有分区数据

创建分区并与已有目录绑定:
  1. ALTER TABLE ext_logs_p ADD PARTITION (date_time='20210510')
  2. LOCATION '/logs/20210510';
  3. ALTER TABLE ext_logs_p ADD PARTITION (date_time='20210511')
  4. LOCATION '/logs/20210511';
  5. ALTER TABLE ext_logs_p ADD PARTITION (date_time='20210512')
  6. LOCATION '/logs/20210512';
复制代码
3. 自动修复分区

如果目录已经存在,可以利用以下下令自动修复分区:
  1. MSCK REPAIR TABLE ext_logs_p;
复制代码
为了让 Hive 自动识别分区,目录应该按以下格式定名:


  • /logs/date_time=20210510/ 包含 log1.txt
  • /logs/date_time=20210511/ 包含 log2.txt
  • /logs/date_time=20210512/ 包含 log3.txt
这种方式会扫描目录结构并自动更新 Hive 元数据,使其与 HDFS 上的现有目录匹配,运行MSCK REPAIR TABLE下令后,Hive 会扫描 /logs/ 目录,自动识别并添加符合格式的分区:


  • date_time='20210510'
  • date_time='20210511'
  • date_time='20210512
外部分区表关联数据的方式



  • 创建分区后利用 LOAD DATA:适用于将新数据加载到指定分区中。
  • 通过 ALTER TABLE ADD PARTITION:用于将已有目录绑定到分区。
  • 利用 MSCK REPAIR TABLE:自动修复分区,适用于已有目录符合分区格式的情况。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表