首页 > 其他分享 >hive分区和分桶你熟悉吗?

hive分区和分桶你熟悉吗?

时间:2024-03-10 20:34:12浏览次数:23  
标签:分桶 INT 分区 hive 查询 user 数据

两种用于优化查询性能的数据组织策略,数仓设计的关键概念,可提升Hive在读取大量数据时的性能。

1 分区(Partitioning)

根据表的某列的值来组织数据。每个分区对应一个特定值,并映射到HDFS的不同目录。

常用于经常查询的列,如日期、区域等。这样可以在查询时仅扫描相关的分区,而不是整个数据集,从而减少查询所需要处理的数据量,提高查询效率。

物理上将数据按照指定的列(分区键)值分散存放于不同的目录中,每个分区都作为表的一个子目录。

创建分区表

CREATE TABLE orders (
    order_id INT,
    order_date DATE,
    order_customer INT,
    order_total FLOAT
)
PARTITIONED BY (country STRING);

基于country列创建分区将使得每个国家的订单数据存储在不同的目录中。

2 分桶(Bucketing)

使用哈希函数将数据行分配到固定数量的存储桶(即文件)中。这在表内部进一步组织数据。

  • 对提高具有大量重复值的列(如用户ID)上JOIN操作的效率特别有用,因为它可以更有效地处理数据倾斜
  • 要求在创建表时指定分桶的列和分桶的数目

创建分桶表

CREATE TABLE user_activities (
    user_id INT,
    activity_date DATE,
    page_views INT
)
CLUSTERED BY (user_id) INTO 256 BUCKETS;

user_id是用于分桶的列,数据会根据用户ID的哈希值分配到256个存储桶中。

3 对比

  • 分区是基于列的值,将数据分散到不同的HDFS目录;分桶则基于哈希值,将数据均匀地分散到固定数量的文件中。
  • 分区通常用于减少扫描数据的量,特别适用于有高度选择性查询的场景;而分桶有助于优化数据的读写性能,特别是JOIN操作。
  • 分区可以动态添加新的分区,只需要导入具有新分区键值的数据;分桶的数量则在创建表时定义且不能更改。

使用分区时要注意避免过多分区会导致元数据膨胀,合理选择分区键,确保分布均匀;而分桶则通常针对具有高度重复值的列。两者结合使用时,可以进一步优化表的读写性能和查询效率。

关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都技术专家兼架构,多家大厂后端一线研发经验,各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。

负责:

  • 中央/分销预订系统性能优化
  • 活动&优惠券等营销中台建设
  • 交易平台及数据中台等架构和开发设计

目前主攻降低软件复杂性设计、构建高可用系统方向。

参考:

本文由博客一文多发平台 OpenWrite 发布!

标签:分桶,INT,分区,hive,查询,user,数据
From: https://www.cnblogs.com/JavaEdge/p/18064740

相关文章

  • 栈区、堆区,内存分区模型
    1.栈区由编译器自动分配释放,存放函数的参数值,局部变量等注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放实例代码:#include<iostream>usingnamespacestd;int*func(){inta=10;//局部变量,存放在栈区,栈区的数据在函数执行完后自动释放ret......
  • hive启动
    1.第一次启动初始化(使用mysql存储其元数据)bin/schematool-initSchema-dbTypemysql-verbos2.启动metastore服务bin/hive--servicemetastorenohupbin/hive--servicemetastore&bin/hive--servicemetastore--hiveconfhive.root.logger=DEBUG,console3.启动h......
  • Hive - 表的存储格式
     Hive的文件存储格式包括:textfile、sequence、rcfile、orc、parquet textfile(简介)默认的文件格式,基于行存储。建表时不指定存储格式即为textfile,导入数据时把数据文件拷贝到hdfs不进行处理。(优点)便于和其他工具(pig,grep,sed,awk)共享数据,便于查看和编辑,加载较快。(缺点)耗费存储......
  • Oceanbase数据库创建分区时报错
    报错信息:ERROR1044(42000):Accessdeniedforuser'root'@'%'todatabase'oceanbase'报错原因:由于OceanBase数据库中,oceanbase库是系统库,里面存放的是系统的很多表,所以不能进行操作,换个库即可,一般到test库下,执行操作......
  • 给/分区扩容
    查看磁盘空间大小,目前/分区大小为20G,并且只有一个磁盘在虚拟机上增加40G/dev/nvme0n1p目前为60G,接下来对磁盘进行分区,创建物理卷,将新增的物理卷加到卷组里对磁盘分区,使用fdisk/dev/nvme0n1,输入n新建分区n为增加一个新的分区p为打印一个分区表其他默认即可最后w保......
  • snappy压缩格式下使用数字与字符串不等于比较,hiveSQL和sparkSQL表现不一致的行为记录
    Hive版本:2.3.4Spark版本:2.4.0当时用Snappy格式对表进行压缩时,时用<>符号将字符串与数字进行比较会产生不一致的结果。SparkSQL结果并非预期结果。DROPTABLEIFEXISTStest.zero_test;CREATETABLEtest.zero_testTBLPROPERTIES("orc.compress"="SNAPPY")ASSELECT......
  • 非 LVM 分区动态扩容
    非LVM分区实现动态扩容,适用于系统分区扩容,无需格式化磁盘,无需重新挂载磁盘扩容步骤以/dev/sda2扩容为例,假设/dev/sda空间足够(或已通过虚拟化管理平台增加容量)使用fdisk-l命令可看到/dev/sda磁盘总容量200GiB,/dev/sda2分区容量100GiBDisk/dev/sda:200GiB,2......
  • hive-3.0.0 版本中遇到的bug 汇总
    目前公司用的hive版本是hive-3.0.0bug较多,这里汇总整理下,以备查阅(如有缺失欢迎补充)1.表单属性bucket_version不同,导致join数据异常1.1自查方式1.用spark-sql和hive的结果数据对比2.用hive引擎对比有无hive.optimize.joinreducededuplication=false参数时的结果目......
  • 开课啦!走进大数据讲堂,一文从0到1学习数据湖Paimon(实践篇一)之集成hive实战演练?助力数据
     第3章集成Hive引擎前面与Flink集成时,通过使用paimonHiveCatalog,可以从Flink创建、删除、查询和插入到paimon表中。这些操作直接影响相应的Hive元存储。以这种方式创建的表也可以直接从Hive访问。更进一步的与Hive集成,可以使用HiveSQL创建、查询Paimon表。......
  • CloudCanal x Hive 构建高效的实时数仓
    简述CloudCanal最近对于全周期数据流动进行了初步探索,打通了Hive目标端的实时同步,为实时数仓的构建提供了支持,这篇文章简要做下分享。基于临时表的增量合并方式基于HDFS文件写入方式临时表统一Schema任务级的临时表基于临时表的增量合并方式Hive目标端写入方式和......