3 回答
TA贡献1805条经验 获得超9个赞
分区数据通常用于水平分布负载,这具有性能优势,并有助于以逻辑方式组织数据。示例:如果我们处理的是一个大employee
表,并且经常使用带有WHERE
将结果限制到特定国家或地区的子句运行查询。为了获得更快的查询响应,Hive表可以是PARTITIONED BY (country STRING, DEPT STRING)
。分区表更改了Hive构造数据存储的方式,Hive现在将创建反映分区结构的子目录,例如
... /员工/ 国家 / 地区= ABC / DEPT = XYZ。
如果查询来自雇员的限制country=ABC
,它将仅扫描一个目录的内容country=ABC
。仅当分区方案反映通用筛选时,这才能大大提高查询性能。分区功能在Hive中非常有用,但是,创建过多分区的设计可能会优化某些查询,但会对其他重要查询不利。另一个缺点是,分区过多是不必要地创建了大量的Hadoop文件和目录,并给NameNode带来了开销,因为它必须将文件系统的所有元数据都保留在内存中。
存储桶是用于将数据集分解为更易于管理的部分的另一种技术。例如,假设一个表date
用作顶级分区和employee_id
第二级分区会导致太多的小分区。相反,如果我们对employee表进行存储并employee_id
用作存储列,则该列的值将由用户定义的数字散列到存储桶中。具有相同记录的记录employee_id
将始终存储在同一存储桶中。假设的数量employee_id
远大于存储桶的数量,则每个存储桶将具有许多employee_id
。创建表时,您可以指定如下CLUSTERED BY (employee_id) INTO XX BUCKETS;
其中XX是存储桶数。桶装有几个优点。桶的数量是固定的,因此它不会随数据波动。如果两个表由进行存储employee_id
,则Hive可以创建逻辑上正确的采样。桶也有助于进行有效的地图侧联接等。
- 3 回答
- 0 关注
- 1223 浏览
添加回答
举报