我知道当您创建ORC表时,它将显著提高速度。但是,我们可以通过对ORC表进行分区和分页来进一步改进它吗?如果是这样的话,如何在现有的ORC表中进行分区和分组?
发布于 2016-08-08 17:27:44
您可以对ORC表进行存储桶和分区。
分区直接映射到HDFS中的目录。您可以更改表和添加分区。你将不得不做分区恢复后你。这里已经很好地解释了一切:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-AlterPartition。
就我个人而言,我会使用动态分区创建新表,并将数据复制到新表中。
发布于 2018-08-04 04:32:14
分区和分页是用于帮助提高查询性能的功能。在Hive中,正如Karol所解释的那样,分区被映射到hdfs目录结构,分区的方式完全由查询需求和模式驱动。例如
customer_purchases表存储了过去2-3年的所有事务(大约1-2PB的数据)。一位分析师正试图回答“按月计算,2017年第一季度发生了多少销售额?”
不带分区的
customer_purchases表架构
transaction_id | cust_id | price_per_unit | units_purchased | invoiceDate
样本数据集
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*.csvSELECT month(invoiceDate),count(*) FROM customer_purchases WHERE YEAR(invoiceDate) = '2017‘,MONTH(invoiceDate)按月分组(InvoiceDate),介于1到3之间
上面的语句执行整个表扫描,以执行过滤(where)和聚合(group by)。这是低效的,因为我们只需要数据集的一小部分。
具有分区的
我们可以推断,分区更多地基于时间序列,因为存在日期范围。为了避免全表扫描,我们可以创建一个更基于月份的分区。以下是更改
customer_purchases表架构(分区列'yr‘和'mon')
transaction_id | cust_id | price_per_unit | units_purchased | invoiceDate | mon
相同的数据以hdfs ://your-nn/your-path/ data *.csv的形式存储在hdfs中,其中是yyyy格式的年份,是1到12 (1月到12月)之间的任意值。
具有新的hdfs结构和配置单元表架构结构。该查询将为
从customer_purchases中选择mon,count(*),其中yr='2017‘,mon按mon在1和3之间分组
上面查询的解释计划现在将只扫描yr=2017目录以及mon=1、mon=2和mon=3子目录下的文件。这是一个很小的数据集,您可以更快地返回结果。
根据ORC文件格式,除了hdfs位置中的文件将是.orc而不是.csv之外,没有任何变化。
BUCKETING添加了对特定文件中的事务进行分组。
这回答了你的问题吗?
DYNAMIC PATITIONING有助于根据表中的输入事务数据自动执行分区。
https://stackoverflow.com/questions/38824760
复制相似问题