Hive面试题6:动态分区

面试时问的一道情景题:

假设我创建了一张表,其中包含了2016年客户完成的所有交易的详细信息,现在我插入了100万条数据,我想知道每个月的总收入。问:如何高效的统计出结果

写出步骤即可

分析:

  1. 首先分析这个需求,其实并不难,但是由于题目说了,要高效。而且数据量也不小,直接写sql查询估计肯定会挂。

  2. 我们可以通过根据每个月对表进行分区来解决查询慢的问题。 因此,对于每个月我们将只扫描分区的数据,而不是整个数据集。

  3. 但是我们不能直接对现有的非分区表进行分区。

所以我们会采取以下步骤来解决这个问题:

假设现在的表是这样

CREATE TABLE transaction_details (id INT, amount FLOAT, month STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
  1. 创建一个分区表,partitioned_transaction:
create table partitioned_transaction (id int, amount float) partitioned by (month string) row format delimited fields terminated by,;
  1. 在Hive中启用动态分区:
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;
  1. 将数据从非分区表导入到新创建的分区表中:
insert overwrite table partitioned_transaction partition (month) select id, amount, month from transaction_details;
  1. 使用新建的分区表实现需求。
SELECT month,sum(amount)
FROM partitioned_transaction partition by month;

主要是考察关于动态分区的知识,这个在实际的大数据场景中使用非常频繁。

发布了35 篇原创文章 · 获赞 12 · 访问量 6634

猜你喜欢

转载自blog.csdn.net/u012955829/article/details/102880383
今日推荐