同时对Hive表进行分区和分区的好处是什么?我有一个表"订单",其中包含1M条记录,但记录来自6个特定城市.现在,如果我只根据城市打包我的表订单,我的仓库目录(在Hive中)有6个不同的文件夹,每个文件夹对应一个特定的城市和数据.
当我分区然后打开我的表订单时,仍然可以在我的仓库目录下看到相同的6个文件夹.我尝试使用16个桶,但仍然,数据的文件夹按城市划分.以下是代码:
create table Orders ( id int, name string, address string)
partitioned by (city string)
clustered by (id) into 16 buckets
row format delimited fields terminated by ','
stored as TEXTFILE
Run Code Online (Sandbox Code Playgroud)
有人可以概述为什么Hive会这样做.此外,我运行了一些性能指标,如计数和分组.我没有发现分区的分段表格有任何重大改进,只有分段或仅分区.
谢谢.
我正在12核上运行Hadoop,36 Gb RAM和8集群.
分区和分段是在物理层分割数据的两种不同类型.
如您所见,当您按列对表进行分区时,将为该列的每个值创建一个目录.因此,您通常希望对基数较低的列进行分区.您将看到的最常见的分区列之一是date.
通过分段,列值被散列为固定数量的桶.这也会物理拆分您的数据.在您的情况下,如果您检查目录中的city文件,您将看到16个文件,每个桶1个.Bucketing通常用于高基数列.
那么,分区和分区的优势是什么?由于数据在物理上是"分区"的,因此查询层可以应用两种类型的优化,称为分区修剪和桶修剪.当WHERE应用允许优化器应用修剪策略的子句时,这些优化将启动.例如,在您的情况下,您有6个目录(城市)乘以16个文件(id存储桶),因此您的表中总共有96个文件.如果你包含了where子句city = "city1",那么只会扫描16个文件,因为分区修剪会启动.如果你使用了where子句id = 10101,那么只有6个文件会被扫描,因为可以应用桶修剪.如果同时应用城市过滤器和ID过滤器,则只需要扫描1个文件.
编辑: 正如评论中所指出的,铲斗修剪仅在Tez引擎中实现.因此,虽然理论上可以修剪存储桶,但Hive MR中尚未实现优化.
| 归档时间: |
|
| 查看次数: |
3943 次 |
| 最近记录: |