Hive:分桶

  • 分桶

    • 分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储
    • 对于 hive 中每一个表,分区都可以进一步进行分桶
    • 由:列的哈希值   / (除以)桶的个数
      • 决定每条数据划分在哪个桶中
  • 与分区的区别
    • 分区:多级目录、每个目录存储固定特征的文件
  • 场景
    • 数据抽样 (sampling)
  • 开启支持分桶
    • set hive.enforce.bucketing=true
      • 1.X 默认是 false
      • 2.x 之后没有,但是默认是支持的
      • MR 运行时会根据 bucket 的个数自动分配 reduce task 个数
        • 用户也可以通过 mapred.reduce.tasks 自已设置 reduce 任务个数,但分桶时不推荐使用
      • 一次作业产生的桶(文件数量)和 reduce task 个数一致

使用

原本数据表

创建分桶表

创建分桶表,表中字段,以 age 字段做为(列哈希值),并指定4个分桶

向分桶表导入数据

分桶数 与 reduce task 数相同

处理后的数据

 四个分桶文件

文件名显示的:0、1、2、3,其实就是分桶文件的:1、2、3、4

 每个分桶文件所写入的数据

桶表抽样查询

select * from 分桶表 tablesample(bucket 1 out of 4 on columns);

 tablesample 语法

百分比抽样

tablesample(40 percent);   即:40%

数据大小抽样

tablesample(20M);   即:20M的数据

行数抽样

tablesample(1000 rows);   即:1000行数据

分桶抽样

  • tablesample(bucket x out of y)
  • x:表示从哪个  “bucket(分桶)”  开始抽取数据
  • y:必须为该表总 bucket 数的,倍数或因子
    • 倍数
      • 获取单个分桶中的部分数据:(总 bucket 数 / y)
        • 总 bucket  4个数  除以  8  :二分之一的数据
        • 也就是获取指定分桶表中的二分之一的数据
          • 可能是 bug (多次尝试)
            • 1个分桶表里有六条数据,y为8时正常显示3条数据,当y为12(三分之一)时应该显示2条数据,可仍然显示3条数据(找到原因再补充)
    • 因子
      • 获取指定分桶表个数:(总 bucket 数 / y)
        • 总 bucket  4个数  除以  2  :2个分桶表
        • 也就是一共获取 2个分桶表的数据
      • 当 y 是因子时,两个分桶表是跳表的方式
        • x 是 1,y 是 2  (x+y)
        • 1 和 3 分桶表的所有数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

家道消乏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值