首页 > 其他分享 >Hive数仓操作(七)

Hive数仓操作(七)

时间:2024-10-01 10:54:35浏览次数:12  
标签:数仓 logs 分区 dynamic Hive TABLE 操作 SELECT STRING

一、 Hive动态分区表

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

  1. 分区定义

    • 静态分区:在插入数据时,需要手动指定分区字段的值。
    • 动态分区:分区字段的值是根据数据中的某个字段自动生成的,用户只需指定分区字段的类型。
  2. 数据加载方式

    • 静态分区:可以通过 LOAD DATAINSERT ... SELECT 加载数据。
    • 动态分区:只能通过 INSERT ... SELECT 加载数据。
  3. 查询要求

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

2. 动态分区设置

  1. 开启动态分区

    SET hive.exec.dynamic.partition = true;
    
  2. 设置动态分区模式

    动态分区有两种模式:

    • strict: 需要与静态分区一起使用,不设置nonstrict的情况下创建动态分区表的同时必需要指定一个静态分区。

      -- 示例: 
      INSERT INTO TABLE students_pt PARTITION(dt='anhui', pt) SELECT ..., pt FROM students;
      
    • nonstrict: 允许单独使用动态分区。

      SET hive.exec.dynamic.partition.mode = nonstrict;
      
  3. 设置最大分区数量

    可以根据业务需求调整支持的最大分区数量。例如,设置为1000:

    SET hive.exec.max.dynamic.partitions.pernode = 1000;
    

示例

1. 动态分区示例
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;

CREATE TABLE student_info_dynamic (
  id INT,
  name STRING,
  sex STRING,
  age INT
)
PARTITIONED BY (year STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';

INSERT INTO TABLE student_info_dynamic
PARTITION (year)
SELECT id, name, sex, age, year FROM source_table;
2. 静态加动态分区示例
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;

CREATE TABLE student_info_static_dynamic (
  id INT,
  name STRING,
  sex STRING
)
PARTITIONED BY (year STRING, month STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';

INSERT INTO TABLE student_info_static_dynamic
PARTITION (year = '2023', month)
SELECT id, name, sex, month FROM source_table;
3. 多个动态分区示例
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;

CREATE TABLE student_info_multi_dynamic (
  id INT,
  name STRING
)
PARTITIONED BY (year STRING, month STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';

INSERT INTO TABLE student_info_multi_dynamic
PARTITION (year, month)
SELECT id, name, year, month FROM source_table;

二、 Hive外部分区表

假设在 HDFS 上已经存在日志目录,其结构如下:

hadoop fs -put log1.txt /logs/20210510
hadoop fs -put log2.txt /logs/20210511
hadoop fs -put log3.txt /logs/20210512

1. 创建外部分区表

CREATE EXTERNAL TABLE ext_logs_p (
  id INT,
  name STRING,
  operate STRING
)
PARTITIONED BY (date_time STRING)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','
LOCATION '/logs';

2. 挂载已有分区数据

创建分区并与已有目录绑定:

ALTER TABLE ext_logs_p ADD PARTITION (date_time='20210510')
LOCATION '/logs/20210510';

ALTER TABLE ext_logs_p ADD PARTITION (date_time='20210511')
LOCATION '/logs/20210511';

ALTER TABLE ext_logs_p ADD PARTITION (date_time='20210512')
LOCATION '/logs/20210512';

3. 自动修复分区

如果目录已经存在,可以使用以下命令自动修复分区:

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:自动修复分区,适用于已有目录符合分区格式的情况。

标签:数仓,logs,分区,dynamic,Hive,TABLE,操作,SELECT,STRING
From: https://blog.csdn.net/m0_58076578/article/details/142665445

相关文章

  • Linux(三)文件管理、复杂操作与实用工具详解
    Linux学习笔记(三)文件管理、复杂操作与实用工具详解Linux学习笔记(二):深入理解用户管理、运行级别与命令行操作1.文件操作的基本操作1.1创建创建目录mkdir:创建目录mkdir/home/dog#创建单级目录mkdir-p/home/animal/tiger#创建多级目录,如果父目录不存在,将连......
  • Linux 学习笔记(二):深入理解用户管理、运行级别与命令行操作
    Linux学习笔记(二):深入理解用户管理、运行级别与命令行操作前置学习内容:Linux学习(一)1.用户管理1.1用户密码管理创建用户密码使用passwd命令可以为指定用户设置密码:sudopasswd`userName`密码找回当忘记密码时,可以采取以下步骤找回:在登录界面按e键进入编......
  • kali操作命令基础
    一:Linux目录结构在Linux中所有都是由文件的形式存在的/bin全名binaries二进制文件/boot启动的核心文件,如镜像/dev全名device存放外部设备如硬盘/etc全名etcetera配置文件和子目录/home用户主目录/root管理员主目录/run临时文件/sbin全名superuserbinaries超级......
  • [操作系统]线程上下文切换
    单核处理器能够支持多线程执行代码就是因为线程的上下文切换。具体是如何做到的呢?CPU通过给每个线程分配CPU时间片来实现这个机制。什么是时间片?CPU分配给每个线程的时间。时间片非常短一般几十ms。CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的。什么是线程上下......
  • 一文带你搞清C语言文件操作
    根据数据组织形式,文件分为文本文件或二进制文件在内存中以二进制的形式存储,不加转换输出到外存的文件中,就是二进制文件如果在外存上要以ASCII码形式存储,则需要在存储前转换,这种方式存储的文件就是文本文件一、流和标准流1、流流是一个抽象的概念。我们需要从外部获取数据,......
  • 操作系统1
    重点:操作系统的基本概念、地位、特征、功能、体系结构、常用的操作系统结构设计方法和作用(发展过程)难点:操作系统与硬件的关系、操作系统与应用程序的关系----------------------------------------------------------------------------------------------------------------......
  • 操作系统2
    一、windows操作系统的体系结构1.内核    功能:线程调度、陷入处理和异常调度、中断处理和调度、多处理器同步、供执行体使用的基本内核对象。2.硬件抽象层HAL    系统可移植性的关键部分,为运行在Windows操作系统上的硬件平台低级接口,隐藏了各种与硬件有关......
  • C语言文件操作(续写)
    文章目录C语言文件操作(续写)文件的随机读写fseekftellrewind文件结束判定被错误使用的feof二进制文件的例子:C语言文件操作(续写)文件的随机读写fseek根据文件指针的位置和偏移量来定位文件指针。#include<stdio.h>intmain(){FILE*pFile;pFi......
  • Python数据库操作:使用Python连接和操作数据库
    Python数据库操作:使用Python连接和操作数据库数据库入门小分队:Python带你探索数据海洋搭建桥梁:使用Python连接数据库的几种常见方式示例代码:使用`sqlite3`创建并连接一个SQLite数据库游刃有余:掌握基本SQL语句与Python的完美结合示例代码:执行复杂的SQL查询实战演练:通过......
  • Gitee简单操作
    gitee上传代码第一步:电脑上先安装git:下载链接https://git-scm.com/downloads#如果在桌面鼠标右键,出现下面两个东西,则安装成功openGitGUIhereopenGitBashhere第二步:注册gitee/github第三步:创建项目仓库(点击右上角+号)本地git配置-全局(最开始做一......