分区和桶ORC表

时间:2016-08-08 08:44:32

标签: hive apache-hive orc

据我所知,在创建ORC表时,它会显着提高速度。但是,我们可以通过分区和分组ORC表来进一步改进它吗?如果是这样,如何在现有的ORC表中进行分区和分段?

2 个答案:

答案 0 :(得分:1)

您可以对ORC表进行存储和分区。

分区直接映射到HDFS中的目录。您可以ALTER TABLE并添加分区。你必须做分区恢复。 这里的一切都很好解释:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-AlterPartition

我个人会用动态分区创建新表并将数据复制到新表中。

答案 1 :(得分:1)

分区和存储桶功能可帮助提高查询性能。正如Karol解释的那样,在Hive中,分区映射到hdfs目录结构,分区方式完全由查询需求和模式决定。例如

customer_purchases表存储了过去2-3年(大约1-2 PB数据)中的所有交易。一位分析师试图回答“ 2017年第一季度每月有多少销售量发生了?”。

没有分区

customer_purchases表架构

  

transaction_id | cust_id | price_per_unit |购买单位|发票日期

样本数据集

1,CustomerId-32,3.24,91,2017-10-19
2,CustomerId-16,3.24,88,2017-10-14
3,CustomerId-3,1.96,99,2017-10-14
4,CustomerId-95,1.96,38,2017-10-17
5,CustomerId-51,1.32,39,2017-10-18
6,CustomerId-29,1.32,14,2017-10-14
7,CustomerId-15,3.88,66,2017-10-19
8,CustomerId-74,1.32,44,2017-10-17
9,CustomerId-43,3.88,22,2017-10-18

Stored as csvs in hdfs://your-nn/your-path/data*.csv
  

SELECT month(invoiceDate),count(*)来自customer_purchases在哪里   YEAR(invoiceDate)='2017'AND MONTH(invoiceDate)在1和3之间   按月分组(发票日期)

上面的语句进行整个表扫描,以执行过滤器(在其中)和聚合(分组依据)。这是低效的,因为我们只需要一部分数据集。

有分区

我们可以推断出该分区是基于时间序列的,因为存在日期范围。为了避免全表扫描,我们可以创建一个基于月份的分区。以下是更改

customer_purchases表模式(分区列“ yr”和“ mon”)

  

transaction_id | cust_id | price_per_unit |购买单位|发票日期| 星期一

相同的数据以hdfs://your-nn/your-path///data*.csv的形式存储在hdfs中,其中yyyy格式的年份,并且介于1到12之间(1月到12月)之间的任何值。

具有新的hdfs结构和配置单元表架构结构。该查询将是

  

选择mon,count(*)从customer_purchases那里yr ='2017'AND mon   在1和3 GROUP BY之间

上述查询的解释计划现在将仅扫描yr = 2017目录以及mon = 1,mon = 2和mon = 3子目录下的文件。这是一个很小的数据集,您可以更快地返回结果。

按照ORC文件格式,除了hdfs位置中的文件是.orc而不是.csv以外,没有任何更改。

BUCKETING将交易分组到特定文件中。

这能回答您的问题吗?

动态分配有助于根据表中的输入交易数据自动执行分区。