一、分桶表的基本介绍

1、什么是分桶表?

        分桶表主要是用于分文件的,在建表的时候,指定按照那些字段执行分桶操作,并可以设置需要分多少个桶,当插入数据的时候,执行MR的分区的操作,将数据分散各个分区(hive分桶)中,默认分发方案是:hash 取模

        注意:对于分桶表,不能使用load data 的方式进行数据插入操作,因为load data 导入的数据不会有分桶结构

2、什么是分区表?

        分区表是数据库中一种特殊的表结构设计,它将数据按照预定义的规则分散存储在多个物理区域(称为 “分区”)中,但对用户来说逻辑上仍然是一个整体表。分区表在逻辑上是一张表,但数据在物理上被拆分为多个独立的存储单元(如文件、文件夹或索引)。用户无需关心数据具体存储在哪个分区,只需像操作普通表一样查询即可。分区的目的是提高查询性能、简化数据管理(如数据归档、删除),尤其适用于数据量极大的表。

3、分桶表和分区表的区别:

1)分桶对数据的处理比分区更加细粒度化;分区针对的是数据的存储路径;分桶针对的是数据文件;

2)分桶是按照列的哈希函数进行分割的,相对比较平均;而分区是按照列的值来进行分割的,容易造成数据倾斜;

3)分桶和分区两者互不干扰,可以把分区表进一步分桶

4)简单来说,分区就是把表分成一个一个文件夹,一个文件夹里面还可以在放文件夹,分桶是把表分成一个一个文件,文件里面就不能在放文件,所以分区可以分好几层,分桶不可以

4、如何构建一个分桶表?

create table test_buck(id int, name string)

clustered by(id) sorted by (id asc) into 6 buckets   -- 创建分桶表的SQL

row format delimited fields terminated by '\t';

5、如何向分桶表添加数据?

标准格式:

        1)创建一张与分桶表一样的临时表,唯一区别是这个表不是一个分桶表

        2)将数据加载到这个临时表中

        3)通过insert into + select 语句将数据导入到分桶表中

注意:sqoop不支持直接对分桶表导入数据

二、分桶表有什么作用

1、进行数据采样

        案例1: 数据质量校验工作(一般会先判断各个字段数据的结构信息是否完整)

        案例2:  在进行数据分析的时候, 一天需要编写N多条SQL, 但是每编写一条SQL后, 都需要对SQL做一个校验, 如果直接面对完整的数据集做校验, 会导致校验时间过长, 影响开发进度, 此时可以先采样出一部分数据

        案例3:  在计算一些比率值,或者 在计算相对指标的时候, 也会基于采样数据来计算相对指标

                比如: 计算当前月的销售额相对上个月 环比增长了百分之多少?

                        可以选择当前月和上个月抽取出百分之30的数据, 基于这个数据来计算

重点:如何进行数据采样

采样函数: tablesample(bucket x out of y on column)

放置位置: 紧紧放置表的后面  如果表有别名 必须放置别名的前面

例如:select * from 表 tablesample(bucket x out of y on column) 表的别名;

说明:

    x:  从第几个桶开始进行采样

    y:  抽样比例(总桶数/y=分多少个桶)

    column: 分桶的字段, 可以省略的

注意:

   x 不能大于 y

   y 必须是表的分桶数量的倍数或者因子

案例:

    1) 假设 A表有10个桶,  请分析, 下面的采样函数, 会将那些桶抽取出来

         tablesample(bucket 2 out of 5 on xxx)

       会抽取几个桶呢?    总桶 / y =  分桶数量    10/5=2

       抽取第几个编号的桶?  (x+y)

           2,7

    2)  假设 A表有20个桶,  请分析, 下面的采样函数, 会将那些桶抽取出来

     tablesample(bucket 4 out of 4 on xxx)

       会抽取几个桶呢?    总桶 / y =  分桶数量   20/4=5

       抽取第几个编号的桶?  (x+y)

           4,8,12,16,20

    tablesample(bucket 4 out of 40 on xxx)

        会抽取几个桶呢?    总桶 / y =  分桶数量   20/40=0.5
抽取第几个编号的桶?  (x+y)
抽4.5,只抽一个

2、提升查询的效率(单表|多表)

单表

不分桶就只能从头到尾一个一个慢慢查,而分桶之后先得到桶编号,在根据桶编号进入对应的桶查询数据即可

多表

分为小表和大表、中型表和大表、大表和大表

        Reduce 端 join:是在 MapReduce 框架下,针对表连接(如将两个或多个数据表依据关联键合并)这一特定操作的实现方式,是一种具体的业务处理策略 ,专注于解决数据关联问题。

reduce端join的流程:

        Map 阶段:读取不同表的数据,为每行数据添加标记以区分来源表,并将数据转换为 <Join Key, Value> 形式输出。例如,对于订单表和用户表,以关联键(如用户 ID)为 Join Key,为来自订单表的数据标记 tag = order,来自用户表的数据标记 tag = user

        Shuffle 阶段:与 MapReduce 的 Shuffle 类似,根据 Join Key 的哈希值将数据分发到对应的 Reduce 节点,保证相同 Join Key 的数据汇聚到一处。

        Reduce 阶段:根据数据标记区分不同表的数据,然后执行表连接操作(如内连接、左连接等),生成最终的连接结果。

可能出现的问题:

1) 可能出现数据倾斜的问题

2) 导致reduce压力较大

小表和大表

采用 map join的方案

        在进行join的时候, 将小表的数据放置到每一个读取大表的mapTask的内存中, 让mapTask每读取一次大表的数据都和内存中小表的数据进行join操作, 将join上的结果输出到reduce端即可, 从而实现在map端完成join的操作

如何开启map Join

   set hive.auto.convert.join=true;  -- 是否开启map Join

   set hive.auto.convert.join.noconditionaltask.size=512000000; -- 设置小表最大的阈值(设置block cache 缓存大小)

中型表和大表

中型表: 与小表相比 大约是小表3~10倍左右

解决方案:

      1) 能提前过滤就提前过滤掉(一旦提前过滤后, 会导致中型表的数据量会下降, 有可能达到小表阈值)

      2) 如果join的字段值有大量的null, 可以尝试添加随机数(保证各个reduce接收数据量差不多的, 减少数据倾斜问题)

      3) 基于分桶表的: bucket map join

 bucket map join的生效条件:

      1) set hive.optimize.bucketmapjoin = true;  --开启bucket map join 支持

      2) 一个表的bucket数是另一个表bucket数的整数倍

      3) bucket列 == join列

      4) 必须是应用在map join的场景中

  注意:如果表不是bucket的,则只是做普通join。

就是把中型表分桶变成小表,在通过小表和大表的方法即可

大表和大表

大表: 与小表相比 大约是小表10倍以上

核心原理

        分桶:两个表按 相同的 Join Key(如 user_id)哈希分桶(例如都分为 100 个桶),确保相同 Join Key 的数据在对应桶中。

        排序:每个桶内的数据按 Join Key 排序,便于快速匹配。

        Map 端计算:Join 时,Map 任务直接读取两个表的对应桶,用 归并排序 算法逐行匹配,无需 Shuffle。

解决方案:

    1). 能提前过滤就提前过滤掉(减少join之间的数量, 提升reduce执行效率)

    2). 如果join的字段值有大量的null, 可以尝试添加随机数(保证各个reduce接收数据量差不多的, 减少数据倾斜问题)

    3). SMB Map join (sort merge bucket map join)

实现SMB map join的条件要求:

      1) 一个表的bucket数等于另一个表bucket数(分桶数量是一致,一对一的关系)

      2) bucket列 == join列 == sort 列

      3) 必须是应用在bucket map join的场景中,也就是已经开启了bucket map join的相关参数

      4) 开启相关的参数:

       -- 开启SMB map join

       set hive.auto.convert.sortmerge.join=true;

       set hive.auto.convert.sortmerge.join.noconditionaltask=true;

       --写入数据强制排序

       set hive.enforce.sorting=true;

       set hive.optimize.bucketmapjoin.sortedmerge = true; -- 开启自动尝试SMB连接

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HighReport报表工具开始支持BS报表设计器

HighReport报表工具同时支持c/s报表设计器和b/s报表设计器&#xff0c;大部分情况下使用c/s报表设计器&#xff0c;在某些业务场景或者用户自己简单修改报表模板&#xff0c;可以用b/s报表设计器。b/s报表设计器和c/s报表设计器操作一样b/s报表设计器免费下载免费使用(c/s报表设…

数据结构--堆的实现

目录 一、堆的概念及结构 二、小根堆的实现 2.1 堆的数据结构 2.2 堆的初始化HeapInit 2.3 堆的销毁HeapDestory 2.4 堆的插入HeapPush ​2.4.1 插入代码HeapPush 2.4.2 向上调整代码AdjustUp 2.4.3 交换数据代码Swap 2.5 堆的删除HeapPop 2.5.1 删除代码HeapPop 2…

evo轨迹评估工具

文章目录evo参数设置evo_traj指标度量evo_apeevo_rpe结果比较evo工具主要有如下六个常用命令&#xff1a; evo_ape - 用于评估绝对位姿误差&#xff1b;evo_rpe- 用于评估相对位姿误差&#xff1b;evo_traj - 这个主要是用来画轨迹、输出轨迹文件、转换数据格式等功能&#xf…

Django+DRF 实战:自定义异常处理流程

文章目录一、DRF 异常处理流程DRF 默认异常处理流程源码二、实战DRF 自定义异常处理流程应用自定义异常处理流程一、DRF 异常处理流程 DRF 默认异常处理流程 DRF默认的异常处理流程如下&#xff1a; 当异常发生时&#xff0c;会自动调用rest_framework.views.exception_hand…

Spring MVC 1

什么是Spring Web MVC 官方对Spring MVC的描述是这样的&#xff1a;Spring Web MVC 是基于Severlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring框架中。它的正式名称“Spring Web MVC”来自其源模块的名称&#xff08;Spring-webmvc&#xff09;&#xff0c;但它…

一个基于若依(ruoyi-vue3)的小项目部署记录

一、背景 收到朋友的求助&#xff0c;他拿到了一个项目的源代码&#xff0c;说需要我帮助部署。部署要求是需要域名访问。 因为没有文档和其他资料以及帮助&#xff0c;我先清理了源收到的资料&#xff1a; 1.后端&#xff1a;是java代码&#xff0c;一看就是若依框架。心里大大…

【实战总结】WMIC在HW行动中的4类关键应用

WMIC命令完全指南&#xff1a;网络安全运维工程师的深度实践手册 关键词&#xff1a;WMIC命令、Windows管理、网络安全运维、系统信息收集、进程分析、自动化审计 【实战总结】WMIC在HW行动中的4类关键应用 1. 前言 在Windows环境下的网络安全运维中&#xff0c;WMIC&#x…

LKT4304稳定可靠高兼容性国产安全加密芯片

随着 IOT 的飞速发展&#xff0c;智能家居&#xff0c;智能汽车&#xff0c;智能工控等物联网设备和云服务的安全问题成为IOT普及的关键障碍。在设计之初就为物联网产品配备正确的安全解决方案&#xff0c;是帮助预防措施的关键所在。LKT4304是凌科芯安专为物联网应用场景而推出…

Android 网络开发核心知识点

Android 网络开发核心知识点 一、基础网络通信 1. HTTP/HTTPS 协议 HTTP方法&#xff1a;GET、POST、PUT、DELETE等状态码&#xff1a;200(成功)、404(未找到)、500(服务器错误)等HTTPS加密&#xff1a;SSL/TLS握手过程报文结构&#xff1a;请求头/响应头、请求体/响应体 2. 网…

DVWA靶场通关笔记-弱会话IDs(Weak Session IDs Medium级别)

目录 一、Session ID 二、代码审计&#xff08;Medium级别&#xff09; 1、配置security为Medium级别 2、源码分析 &#xff08;1&#xff09;index.php &#xff08;2&#xff09;Medium.php &#xff08;3&#xff09;对比分析 &#xff08;4&#xff09;渗透思路 三…

编辑器Vim的快速入门

如大家所了解的&#xff0c;Vim是一个很古老的编辑器&#xff0c;但是并没有随着时间的流逝消失在编辑器/IDE 的竞争中&#xff0c;Vim 独创的模式机制和 hjkl 移动光标方式使得使用者在编辑文件时可以双手不离开键盘&#xff0c;极大地提升了工作效率。由于 Vim 学习曲线极为陡…

深度学习核心:从基础到前沿的全面解析

&#x1f9e0; 深度学习核心&#xff1a;从基础到前沿的全面解析 &#x1f680; 探索深度学习的核心技术栈&#xff0c;从神经网络基础到最新的Transformer架构 &#x1f4cb; 目录 &#x1f52c; 神经网络基础&#xff1a;从感知机到多层网络&#x1f5bc;️ 卷积神经网络&am…

MySQL索引:数据库的超级目录

MySQL索引&#xff1a;数据库的「超级目录」 想象你有一本1000页的百科全书&#xff0c;要快速找到某个知识点&#xff08;如“光合作用”&#xff09;&#xff1a; ❌ 无索引&#xff1a;逐页翻找 → 全表扫描&#xff08;慢&#xff01;&#xff09;✅ 有索引&#xff1a;直接…

景观桥 涵洞 城门等遮挡物对汽车安全性的影响数学建模和计算方法,需要收集那些数据

对高速公路景观桥影响行车视距的安全问题进行数学建模&#xff0c;需要将物理几何、动力学、概率统计和交通流理论结合起来。以下是分步骤的建模思路和关键模型&#xff1a;一、 核心建模目标 量化视距&#xff08;Sight Distance, SD&#xff09;&#xff1a;计算实际可用视距…

Git 用户名和邮箱配置指南:全局与项目级设置

查看全局配置 git config --global user.name # 查看全局name配置 git config --global user.email # 查看全局email配置 git config --global --list # 查看所有全局配置查看当前项目配置 git config user.name # 查看当前项目name配置 git config user.email # 查看当前项目…

视频序列和射频信号多模态融合算法Fusion-Vital解读

视频序列和射频信号多模态融合算法Fusion-Vital解读概述模型整体流程视频帧时间差分归一化TSM模块视频序列特征融合模块跨模态特征融合模块概述 最近看了Fusion-Vital的视频-射频&#xff08;RGB-RF&#xff09;融合Transformer模型。记录一下&#xff0c;对于实际项目中的多模…

frp内网穿透下创建FTP(解决FTP“服务器回应不可路由的地址。使用服务器地址替代”错误)

使用宝塔面板&#xff0c;点击FTP&#xff0c;下载Pure-FTPd插件 点击Pure-FTPd插件&#xff0c;修改配置文件&#xff0c;找到PassivePortRange, 修改ftp被动端口范围为39000 39003&#xff0c;我们只需要4个被动端口即可&#xff0c;多了不好在内网穿透frp的配置文件中增加…

STM32控制四自由度机械臂(SG90舵机)(硬件篇)(简单易复刻)

1.前期硬件准备 2s锂电池一个&#xff08;用于供电&#xff09;&#xff0c;stm32f103c8t6最小系统板一个&#xff08;主控板&#xff09;&#xff0c;两个摇杆&#xff08;用于摇杆模式&#xff09;&#xff0c;四个电位器&#xff08;用于示教器模式&#xff09;&#xff0c…

华为OD机试_2025 B卷_最差产品奖(Python,100分)(附详细解题思路)

题目描述 A公司准备对他下面的N个产品评选最差奖&#xff0c; 评选的方式是首先对每个产品进行评分&#xff0c;然后根据评分区间计算相邻几个产品中最差的产品。 评选的标准是依次找到从当前产品开始前M个产品中最差的产品&#xff0c;请给出最差产品的评分序列。 输入描述 第…

飞算JavaAI:重塑Java开发效率的智能引擎

飞算JavaAI:重塑Java开发效率的智能引擎 一、飞算JavaAI核心价值 飞算JavaAI是全球首款专注Java语言的智能开发助手,由飞算数智科技(深圳)有限公司研发。它通过AI大模型技术实现: 全流程自动化:从需求分析→软件设计→代码生成一气呵成工程级代码输出:生成包含配置类、…