我知道,当你创建兽人表,它会大大提高速度。但是,我们可以通过分区和绑定orc表来进一步改进它吗?如果是这样,如何在现有orc表中进行分区和bucketing?
j13ufse21#
可以对orc表进行存储和分区。分区直接Map到hdfs中的目录。您可以更改表并添加分区。你得先做分区恢复。一切都解释得很清楚:https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#languagemanualddl-改变分区。我个人会用动态分区创建新表,并将数据复制到新表中。
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将事务分组到特定文件中。这回答了你的问题吗?动态分区有助于根据表中的输入事务数据自动执行分区。
2条答案
按热度按时间j13ufse21#
可以对orc表进行存储和分区。
分区直接Map到hdfs中的目录。您可以更改表并添加分区。你得先做分区恢复。一切都解释得很清楚:https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#languagemanualddl-改变分区。
我个人会用动态分区创建新表,并将数据复制到新表中。
yvfmudvl2#
分区和bucketing是用来帮助提高查询性能的特性。在hive中,正如karol所解释的,分区被Map到hdfs目录结构,分区的方式完全由查询需求和模式驱动。例如
customer\u purchases表存储了过去2-3年的所有事务(大约1-2 pb的数据)。一位分析师正试图回答“2017年第一季度每月有多少销售额?”。
无隔板
客户采购表架构
交易|客户|价格|每单位|购买单位|发票日期
样本数据集
选择月(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将事务分组到特定文件中。
这回答了你的问题吗?
动态分区有助于根据表中的输入事务数据自动执行分区。