分区
- 分区的目的是缩小搜索范围,加快查询速度
- 分区是针对表进行的,一个表可以从多个维度进行分区
- 分区是创建表时通过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个桶
把表组织成桶的两个理由
- 获得更高的查询处理效率
- 桶为表加上了额外的结构,Hive在处理有些查询时能利用这个结构.具体而言,连续两个在相同列上划分了桶的表,可以使用Map端连接高效的实现.
- 使取样更高效.在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便
