Hive的相关概念——分区表、分桶表

目录

一、Hive分区表

1.1 分区表的概念

1.2 分区表的创建

1.3 分区表数据加载及查询

1.3.1 静态分区

1.3.2 动态分区

1.4 分区表的本质及使用

1.5 分区表的注意事项

1.6 多重分区表

二、Hive分桶表

2.1 分桶表的概念

2.2 分桶表的创建

2.3 分桶表的数据加载

2.4 分桶表的作用

一、Hive分区表

1.1 分区表的概念

          Partition分区表是hive的一种优化手段表,当Hive表数据量大,查询时通过 where子句筛选指定的分区,这样的查询效率会提高很多,避免全表扫描

       Hive支持根据指定的字段进行分区,分区的字段可以是日期、地域、种类等具有标识意义的字段。分区在存储层面上的表现是table表目录下以子文件夹形式存在一个文件夹表示一个分区。子文件命名标准:分区列=分区值,Hive还支持分区下继续创建分区,所谓的多重分区。

1.2 分区表的创建

  • 语法
create table table_name (column1 data_type, column2 data_type) 
partitioned by (partition1 data_type, partition2 data_type,….)
row format delimited fields terminated by '\t';
  • 示例 

     创建一张分区表t_all_hero_part,以role角色作为分区字段

create table t_all_hero_part(
       id int,
       name string,
       hp_max int,
       mp_max int,
       attack_max int,
       defense_max int,
       attack_range string,
       role_main string,
       role_assist string
) 
partitioned by (role string)
row format delimited
fields terminated by "\t";

 ps:分区字段不能是表中已经存在的字段,因为分区字段最终也会以虚拟字段的形式显示在表结构上,可以将分区字段看作表的伪列。

1.3 分区表数据加载及查询

1.3.1 静态分区

  • 数据加载

     静态分区指的是分区的字段值是由用户在加载数据的时候手动指定的。语法如下:

load data [local] inpath ' ' into table tablename partition(分区字段='分区值'...);

    关键字Local存在表示原数据是位于本地文件系统(linux);关键字Local不存在:表示原数据是位于HDFS文件系统。
  (1)假设原文件位于HDFS文件系统,则静态加载数据的操作如下:

create external table ods_log_inc
(
    common   struct<ar :string,ba :string,ch :string,is_new :string,md :string,mid :string,os :string,uid :string,vc
                      :string> comment '公共信息',
    page     struct<during_time :string,item :string,item_type :string,last_page_id :string,page_id
                      :string,source_type :string> comment '页面信息',
    actions  array<struct<action_id:string,item:string,item_type:string,ts:bigint>> comment '动作信息',
    displays array<struct<display_type :string,item :string,item_type :string,order :string,pos_id
                            :string>> comment '曝光信息',
    start    struct<entry :string,loading_time :bigint,open_ad_id :bigint,open_ad_ms :bigint,open_ad_skip_ms
                      :bigint> comment '启动信息',
    err      struct<error_code:bigint,msg:string> comment '错误信息',
    ts       bigint  comment '时间戳'
) comment '活动信息表'
    partitioned by (dt string)
    row format serde 'org.apache.hadoop.hive.serde2.jsonserde'
    location '/warehouse/gmall/ods/ods_log_inc/';

#==============数据装载
load data inpath '/origin_data/gmall/log/topic_log/2020-06-15' into table ods_log_inc partition(dt='2020-06-15');

  (2)假设原文件位于本地的linux系统,则静态加载数据的操作如下:

create table t_order (
       oid int ,
       uid int ,
       otime string,
       oamount int
 )
 comment '订单表'
partitioned by (dt string)
row format delimited fields terminated by ",";
#=========数据加载
load data local inpath "/opt/module/hive_data/t_order.txt"  into table t_order partition(dt ='2024-02-14');

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

  • 数据查询

select * from t_order where dt='2024-02-14';

1.3.2 动态分区

      所谓动态分区指的是:分区的字段值是基于查询结果自动推断出来的,核心语法就是insert+select。

       hive是批处理系统,提供了一个动态分区功能,其可以基于查询参数的位置推断分区的名称,从而建立分区

启用hive动态分区,需要设置两个参数:

# 表示开启动态分区功能能(默认true)
set hive.exec.dynamic.partition=true;
#设置为非严格模式nonstrict 
set hive.exec.dynamic.partition.mode=nonstrict;

-----动态分区的模式,分为nonstick非严格模式和strict严格模式。,hive动态分区默认是strict,该模式要求至少有一个分区为静态分区 ,nonstrict 模式表示允许所有的分区字段都可以使用动态分区

    Hive对其创建的动态分区数量实施限制,总结而言:每个节点默认限制100个动态分区,所有节点的总(默认)限制为1000个动态分区,相关参数如下:

#在每个执行MR的节点上,最大可以创建多少个动态分区,默认值为100
hive.exec.max.dynamic.partitions.pernode=100;
ps:该参数需要根据业务数据来设定。比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数
需要设置成大于365,如果使用默认值100,则会报错。

#在所有执行 MR 的节点上,最大一共可以创建多少个动态分区,默认1000
hive.exec.max.dynamic.partitions=1000;

#整个MR Job 中,最大可以创建多少个HDFS 文件,默认100000
hive.exec.max.created.files=100000;

    ps:实际生产环境中,动态分区数量的阈值可以根据业务数据情况进行调整。

# 创建一张新的分区表t_all_hero_part_dynamic
create table t_all_hero_part_dynamic(
         id int,
         name string,
         hp_max int,
         mp_max int,
         attack_max int,
         defense_max int,
         attack_range string,
         role_main string,
         role_assist string
) partitioned by (role string)
row format delimited
fields terminated by "\t";

# 需求:将t_all_hero表中的数据按照角色(role_main 字段),插入到目标表t_all_hero_part_dynamic的相应分区中。
insert into table t_all_hero_part_dynamic partition(role) 
select tmp.*,tmp.role_main from t_all_hero as tmp;

#查看目标表的的分区情况
 show partitions t_all_hero_part_dynamic;

#查看分区表结构
 desc formatted t_all_hero_part_dynamic;

   动态分区插入时,分区值是根据查询返回字段位置自动推断的。上述代码中,推断出原表t_all_hero中的字段role_main是 目标表t_all_hero_part_dynamic 的动态分区字段

1.4 分区表的本质及使用

      分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹,该文件夹下是该分区所
有的数据文件。 分区表的使用重点在于:
  • 建表时根据业务场景设置合适的分区字段。比如日期、地域、类别等;
  • 查询的时候尽量先使用where进行分区过滤,查询指定分区的数据,避免全表扫描。

1.5 分区表的注意事项

  • 分区表不是建表的必要语法规则,是一种优化手段表,可选;
  • 分区字段不能是表中已有的字段,不能重复;
  • 分区字段是虚拟字段,其数据并不存储在底层的文件中;
  • 分区字段值可以手动指定(静态分区),也可以根据查询结果位置自动推断(动态分区)
  • Hive支持多重分区,也就是说在分区的基础上继续分区,支持更细粒度的目录划分

1.6 多重分区表

      Hive支持多个分区字段:partitioned by (partition1 data_type, partition2 data_type,….);多重分区下,分区之间是一种递进关系,可以理解为在前一个分区的基础上继续分区。从HDFS的角度来看就是文件夹下继续划分子文件夹。

    例如创建一张三分区表,按省份、市、县分区

# 创建分区表
create table t_user_province_city_county (
      id int,
      name string,
      age int
) 
partitioned by (province string, city string,county string)
row format delimited  fields terminated by ",";


#加载数据到三级分区表中
load data local inpath '文件路径' into table t_user_province_city_county partition(province='hubei',city='xiangyang',county='gucheng');

二、Hive分桶表

2.1 分桶表的概念

        Bucket分桶表是hive的一种优化手段表。分桶是指数据表中某字段的值,经过hash计算规则将数据分为指定的若干小文件。 Bucket分桶表在hdfs中表现为同一个表目录下的数据根据hash散列之后变成多个文件。分区针对的是数据的存储路径;分桶针对的是数据文件(数据粒度更细)。

      分桶默认规则是:分桶编号Bucket number = hash_function(分桶字段) % 桶数量。桶编号相同的数据会被分到同一个桶当中。

  ps:hash_function函数取决于分桶字段的数据类型,如果是int类型,hash_function(int) == int;

  如果是其他数据类型,比如bigint,string或者复杂数据类型,hash_function比较棘手,将是从该类型派生的某个数字,比如hashcode值。


 

2.2 分桶表的创建

  • 语法
--分桶表建表语句
create [external] table [db_name.]table_name[(col_name data_type, ...)]
clustered by (col_name)  #--根据col_name字段分桶
into n buckets  #--分为n桶
row format delimited fields terminated by '\t';
  • 示例
--创建分桶表,分为4桶
create table stu_buck(
       id int,
       name string
)
clustered by(id) 
into 4 buckets


--创建分桶表,分为4桶,还可以指定分桶内的数据排序规则,根据id倒叙排序
create table stu_buck(
       id int,
       name string
)
clustered by(id)   sorted by (id desc)
into 4 buckets 

--查看表结构
 desc formatted stu_buck;

   ps:分桶的字段必须是表中已经存在的字段。

2.3 分桶表的数据加载

load data inpath '/student.txt' into table stu_buck;

2.4 分桶表的作用

  • 基于分桶字段查询时,减少全表扫描;
  • join时可以提高MR程序效率,减少笛卡尔积数量;
    对于join操作两个表有一个相同的列,如果对这两个表都进行了分桶操作。那么将保存相同列值的桶进行JOIN操作就可以,这种join方式也称作SMB(Sort Merge Bucket join)

三、总结

  • 分区针对的是数据的存储路径;分桶针对的是数据文件(数据粒度更细)
  • 分区本质是划分hdfs目录,分桶本质是划分数据本身
  • 分区字段不能是表中已经存在的字段,分桶的字段必须是表中已经存在的字段

参考文章:

https://blog.51cto.com/alanchan2win/6453477

HiveQL常用查询语句——排序、分桶、分桶抽样子句记录_hive 按分桶查询吗-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/387747.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库第一次实验

目录 1 实验内容 2 SQL代码 3 效果截图 1 实验内容 熟悉SQL实验环境配置和进行实验数据准备&#xff0c;用SQL Server、PostgreSQL或MySQL创建数据库&#xff0c; 并按照下列关系模式定义数据表&#xff0c;加入适当约束&#xff1a; 学生&#xff08;学号、姓名、性别、…

free pascal:fpwebview 组件通过JSBridge调用本机TTS

从 https://github.com/PierceNg/fpwebview 下载 fpwebview-master.zip 简单易用。 先请看 \fpwebview-master\README.md cd \lazarus\projects\fpwebview-master\demo\js_bidir 学习 js_bidir.lpr &#xff0c;编写 js_bind_speak.lpr 如下&#xff0c;通过JSBridge调用本机…

在中国做 DePIN?你需要明白风险与机遇

撰文&#xff1a;肖飒团队 来源Techub News专栏作者 随着科技的发展&#xff0c;我们正在日益进入一个资源相对过剩的时代&#xff0c;这使我们在日常生活中虽然支付了该部分资源的使用费&#xff0c;但却时常不能将其「物尽其用」&#xff0c;难免出现资源浪费。例如&#x…

秒懂百科,C++如此简单丨第十九天:动态规划

目录 动态规划的初步理解 求最短路径数 洛谷 P1002 过河卒 题目描述 输入样例 输出样例 思路 AC Code 动态规划的初步理解 什么是动态规划&#xff1f;最直白的理解就是动态的规划。 那高级一点的理解呢&#xff1f;就是每时每刻都拿着一个小本本&#xff0c;也就是…

模型 人货场

系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。连接消费者与商品的桥梁。 1 ”人货场“模型的应用 1.1 以抖音直播电商为背景的人货场应用-小杨哥的带货奇迹 小杨哥&#xff0c;一位知名的抖音主播&#xff0c;以其幽默风趣的直播风格和独…

Vegeta压测工具学习与使用

Vegeta压测工具学习与使用 目标&#xff1a; 能够在命令行下使用Vegeta对指定API进行测试了解如何导出结果&#xff0c;以及能获得什么样的结果(P99,P99.9,QPS)探索能否导出其他结果&#xff0c;是否能够执行复杂命令或简易脚本等 时间比较紧迫&#xff0c;预计两到三个小时内完…

pytorch tensor维度变换

目录 1. view/reshape2. squeeze/unsqueeze3. expand 扩展4. repeat5 .t转置6. transpose7. permute 1. view/reshape view(*shape) → Tensor 作用&#xff1a;类似于reshape&#xff0c;将tensor转换为指定的shape&#xff0c;原始的data不改变。返回的tensor与原始的tensor…

Python爬虫之自动化测试Selenium#7

爬虫专栏&#xff1a;http://t.csdnimg.cn/WfCSx 前言 在前一章中&#xff0c;我们了解了 Ajax 的分析和抓取方式&#xff0c;这其实也是 JavaScript 动态渲染的页面的一种情形&#xff0c;通过直接分析 Ajax&#xff0c;我们仍然可以借助 requests 或 urllib 来实现数据爬取…

[缓存] - 2.分布式缓存重磅中间件 Redis

1. 高性能 尽量使用短key 不要存过大的数据 避免使用keys *&#xff1a;使用SCAN,来代替 在存到Redis之前压缩数据 设置 key 有效期 选择回收策略(maxmemory-policy) 减少不必要的连接 限制redis的内存大小&#xff08;防止swap&#xff0c;OOM&#xff09; slowLog …

奇异递归模板模式应用1-对象计数

需求&#xff1a;有时遇到某些类特征相似而又没有共同的父类&#xff0c;希望能够知道这些类的创建数量之和。 思路&#xff1a;将这些类继承自同一个计数类&#xff0c;共享计数变量s_createCount信息&#xff0c;实现如下&#xff1a; class Counter { public:Counter() {s_…

OpenGL-ES 学习(2)---- DepthTest

深度测试 OpenGL-ES 深度测试是指在片段着色器执行之后&#xff0c;利用深度缓冲区所保存的深度值决定当前片段是否被丢弃的过程 深度缓冲区通常和颜色缓冲区有着相同的宽度和高度&#xff0c;一般由窗口系统自动创建并将其深度值存储为 16、 24 或 32 位浮点数。(注意只保存…

函数求导法则【高数笔记】

【分类】 1. 四则运算求导 2. 复合运算求导 3. 整体思想求导 #整体思想求导本质是运用复合运算求导&#xff0c;只不过是对复合运算求导的一种精炼 #无论是具体函数还是抽象函数求导&#xff0c;方法是一致的 【四则运算求导】 加&#xff0c;减&#xff0c;乘&#xff0c;除&a…

Javaweb基础-tomcat,servlet

一.配置文件基础&#xff1a; properties配置文件&#xff1a; 由键值对组成 键和值之间的符号是等号 每一行都必须顶格写&#xff0c;前面不能有空格之类的其他符号 xml配置文件&#xff1a;&#xff08;xml语法HTML语法HTML约束&#xff09;xml约束-DTD / Schema DOM4…

代码随想录算法训练营第三十一天 |基础知识,455.分发饼干,376.摆动序列,53.最大子序和(已补充)

基础知识&#xff1a; 题目分类大纲如下&#xff1a; #算法公开课 《代码随想录》算法视频公开课(opens new window)&#xff1a;贪心算法理论基础&#xff01;(opens new window),相信结合视频再看本篇题解&#xff0c;更有助于大家对本题的理解。 #什么是贪心 贪心的本质…

MySQL什么情况下会死锁,发生了死锁怎么处理呢?

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

Springboot加载bootstrap和application原理

Springboot加载bootstrap和application原理 bootstrap.yml能被springboot加载导入依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.6</version><rel…

Web 目录爆破神器:Dirsearch 保姆级教程

一、介绍 dirsearch 是一款用于目录扫描的开源工具&#xff0c;旨在帮助渗透测试人员和安全研究人员发现目标网站上的隐藏目录和文件。与 dirb 类似&#xff0c;它使用字典文件中的单词构建 URL 路径&#xff0c;然后发送 HTTP 请求来检查这些路径是否存在。 以下是 dirsearc…

开店必知:如何在社区开一家最受欢迎的店

在社区开一家受欢迎的店需要综合考虑多个因素。以下是一些关键要点&#xff0c;以帮助你实现这一目标。 1、了解社区需求&#xff1a; 在选择经营项目之前&#xff0c;深入了解社区的特点和需求。研究社区人口结构、消费习惯以及竞争对手情况。这将有助于你确定适合该社区的产…

基于AI Agent探讨:安全领域下的AI应用范式

先说观点&#xff1a;关于AI应用&#xff0c;通常都会聊准召。但在安全等模糊标准的场景下&#xff0c;事实上不存在准召的定义。因此&#xff0c;AI的目标应该是尽可能的“像人”。而想要评价有多“像人”&#xff0c;就先需要将人的工作数字化。而AI Agent是能够将数字化、自…

数据结构.图的存储

一、邻接矩阵法 二、邻列表法 三、十字链表法
最新文章