分区

  • 分区的目的是缩小搜索范围,加快查询速度
  • 分区是针对表进行的,一个表可以从多个维度进行分区
  • 分区是创建表时通过partition by子句定义的

分桶

  • 分桶时相对分区进行更细粒度的划分.分桶将整个数据内容按照某列属性值的hash值进行区分
  • 如按照name字段分为3个桶,就是对name字段数据的hash值对3取模,按照取模结果对数据分桶.
  • 如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件
  • 分桶之前要执行的命令
    • hive>set hive.enforce.bucketing=true;
    • hive>set mapreduce.job.reduces=num;//reduces数量应该与分桶数保持一致
  • 使用关键字clustered by 指定分桶依据的列名,还要用num buckets指定分为多少桶
    • clustered by(name)into 3 buckets//针对eid字段分3个桶

把表组织成桶的两个理由

  1. 获得更高的查询处理效率
    1. 桶为表加上了额外的结构,Hive在处理有些查询时能利用这个结构.具体而言,连续两个在相同列上划分了桶的表,可以使用Map端连接高效的实现.
  2. 使取样更高效.在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便