分桶表意义与作用
分桶表
书写格式
[CLUSTERED BY (col_name, col_name, …) 分桶的字段,是从表的普通字段中来取 [SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]
使用场景
通常,在管理大规模数据集的时候都需要进行分区,比如将日志文件按天进行分区,从而保证数据细粒度的划分,使得查询性能得到提升。
分桶表意义
分桶将整个数据内容按照某列属性值取 hash 值进行区分,具有相同 hash 值的数据进入到同一个文件中。
建表时指定了CLUSTERED BY,这个表称为分桶表! 分桶: 和MapReduce中分区是一个概念! 是把数据分散到多个文件中!
分桶的作用
1. 取样 sampling 更高效。没有分区的话需要扫描整个数据集。
2. 提升某些查询操作效率,例如 map side join
分桶本质上也是为了分散数据!在分桶后,可以结合hive提供的抽样查询,只查询指定桶的数据 在分桶时,也可以指定将每个桶的数据根据一定的规则来排序 如果需要排序,那么可以在CLUSTERED BY后跟上SORTED BY
举例说明
比如按照 name 属性分为3个桶,就是对 name 属性值的 hash 值对 3 取摸,按照取模结果对数据分桶。
取模结果为 0 的数据记录存放到一个文件
取模结果为 1 的数据记录存放到一个文件
取模结果为 2 的数据记录存放到一个文件
取模结果为 3 的数据记录存放到一个文件
重点
1:CLUSTERED BY来指定划分桶所用列和划分桶的个数。HIVE对key的hash值除bucket个数取余数,保证数据均匀随机分布在所有bucket里。
2: SORTED BY对桶中的一个或多个列另外排序
总结:
我们发现其实桶的概念就是MapReduce的分区的概念,两者完全相同。物理上每个桶就是目录里的一个文件,一个作业产生的桶(输出文件)数量和reduce任务个数相同。
而分区表的概念,则是新的概念。分区代表了数据的仓库,也就是文件夹目录。每个文件夹下面可以放不同的数据文件。通过文件夹可以查询里面存放的文件。但文件夹本身和数据的内容毫无关系。
桶则是按照数据内容的某个值进行分桶,把一个大文件散列称为一个个小文件。
这些小文件可以单独排序。如果另外一个表也按照同样的规则分成了一个个小文件。两个表join的时候,就不必要扫描整个表,只需要匹配相同分桶的数据即可。效率当然大大提升。
同样,对数据抽样的时候,也不需要扫描整个文件。只需要对每个分区按照相同规则抽取一部分数据即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?