面试时问的一道情景题:
假设我创建了一张表,其中包含了2016年客户完成的所有交易的详细信息,现在我插入了100万条数据,我想知道每个月的总收入。问:如何高效的统计出结果
写出步骤即可
分析:
-
首先分析这个需求,其实并不难,但是由于题目说了,要高效。而且数据量也不小,直接写sql查询估计肯定会挂。
-
我们可以通过根据每个月对表进行分区来解决查询慢的问题。 因此,对于每个月我们将只扫描分区的数据,而不是整个数据集。
-
但是我们不能直接对现有的非分区表进行分区。
所以我们会采取以下步骤来解决这个问题:
假设现在的表是这样
CREATE TABLE transaction_details (id INT, amount FLOAT, month STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
- 创建一个分区表,partitioned_transaction:
create table partitioned_transaction (id int, amount float) partitioned by (month string) row format delimited fields terminated by ‘,’ ;
- 在Hive中启用动态分区:
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;
- 将数据从非分区表导入到新创建的分区表中:
insert overwrite table partitioned_transaction partition (month) select id, amount, month from transaction_details;
- 使用新建的分区表实现需求。
SELECT month,sum(amount)
FROM partitioned_transaction partition by month;
主要是考察关于动态分区的知识,这个在实际的大数据场景中使用非常频繁。