分区和桶orc表

nmpmafwu  于 2021-06-28  发布在  Hive
关注(0)|答案(2)|浏览(423)

我知道,当你创建兽人表,它会大大提高速度。但是,我们可以通过分区和绑定orc表来进一步改进它吗?如果是这样,如何在现有orc表中进行分区和bucketing?

j13ufse2

j13ufse21#

可以对orc表进行存储和分区。
分区直接Map到hdfs中的目录。您可以更改表并添加分区。你得先做分区恢复。一切都解释得很清楚:https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#languagemanualddl-改变分区。
我个人会用动态分区创建新表,并将数据复制到新表中。

yvfmudvl

yvfmudvl2#

分区和bucketing是用来帮助提高查询性能的特性。在hive中,正如karol所解释的,分区被Map到hdfs目录结构,分区的方式完全由查询需求和模式驱动。例如
customer\u purchases表存储了过去2-3年的所有事务(大约1-2 pb的数据)。一位分析师正试图回答“2017年第一季度每月有多少销售额?”。
无隔板
客户采购表架构
交易|客户|价格|每单位|购买单位|发票日期
样本数据集

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

选择月(invoicedate),从客户购买中计数(),其中年(invoicedate)=“2017”和月(invoicedate)介于1和3之间,按月分组(invoicedate)
上面的语句执行整个表扫描以执行筛选(where)和聚合(groupby)。这是低效的,因为我们只需要数据集的一小部分。
带隔板
我们可以推断,分区更基于时间序列,因为有一个日期范围。为了避免全表扫描,我们可以创建一个更基于月份的分区。以下是更改
customer\u purchases表架构(分区列'yr'和'mon')
交易|客户|价格|每单位|购买单位|发票日期|周一
hdfs中存储的数据与hdfs://your-nn/your-path///data
.csv,其中是yyyy格式的年份,是介于1和12(一月到十二月)之间的任何值。
使用新的hdfs结构和hive表模式结构。查询将是
选择mon,count()from customer\u purchases where yr='2017'and mon between 1 and 3 group by mon.从客户购买中选择mon,count(),其中yr='2017'和mon介于1和3之间
上面查询的explain计划现在只扫描yr=2017目录和mon=1、mon=2和mon=3子目录下的文件。这是一个小数据集,您将更快地返回结果。
按照orc文件格式,除了hdfs位置中的文件是.orc而不是.csv之外,没有任何更改。
bucketing将事务分组到特定文件中。
这回答了你的问题吗?
动态分区有助于根据表中的输入事务数据自动执行分区。

相关问题