我目前正在使用包含交易数据的Hive表,我需要对这些数据进行一些基本统计,并将结果放在一个新表中。
编辑:我在Hadoop 2.4.1上使用Hive 0.13。
CONTEXT
首先,让我尝试呈现输入表:这是一个包含3列,ID,日期(月/年)和金额的表:
<ID> <Date> <Amount>
1 11.2014 5.00
2 11.2014 10.00
3 12.2014 15.00
1 12.2014 7.00
1 12.2014 15.00
2 01.2015 20.00
3 01.2015 30.00
3 01.2015 45.00
... ... ...
所需的输出包括一个按ID分组的表格,其中每一行我总计每个相应月份的金额:
<ID> <11.2014> <12.2014> <01.2015> <...>
1 5.00 22.00 0.00 ...
2 10.00 0.00 20.00 ...
3 15.00 0.00 75.00 ...
... ... ... ... ...
考虑到原始表具有> 400万个ID且&gt; 5亿线,超过2年。由于我不知道应该创建多少列,所以手工硬编码似乎很难。
(我知道我有多少个不同的日期,但是如果原始表格增长超过5年,10年,15年,那么手工制作将会有很多工作要做,而且存在风险。)
挑战
我知道如何做一些基本的操作和GROUP BY,我甚至可以做一些CASE WHEN,但我问题中的棘手部分是我不能创建这样的列(如上所述)......
SUM (CASE WHEN Date = 11.2014 THEN Amount ELSE 0 END) AS 11.2014
SUM (CASE WHEN Date = 12.2014 THEN Amount ELSE 0 END) AS 12.2014
SUM (CASE WHEN Date = 01.2015 THEN Amount ELSE 0 END) AS 01.2015
SUM (CASE WHEN Date = ??? THEN Amount ELSE 0 END) AS ???
...因为我不知道我最终会有多少不同的日期,所以我需要这样的事情:
SUM (CASE WHEN Date = [loop over each dates] THEN Amount ELSE 0 END)
AS [the date selected in the loop]
问题
你有什么建议可以:
我想避免使用UDF,但在这一点上我不确定它是否可以预防,因为我没有发现任何重新组合我的情况。
提前致谢,不要犹豫,询问更多信息。
答案 0 :(得分:0)
评论太长了。
您无法在Hive中完成所需的操作,因为SQL查询在定义时必须具有固定数量的列。
你能做什么?
最简单的方法就是改变你想要的东西。产品多行而不是多列:
select id, date, sum(amount)
from table t
group by id, date;
然后,您可以将数据加载到您喜欢的电子表格中并将其转移到那里。
其他替代方案。您可以编写一个将编写相应查询的查询。这将遍历表,识别可能的日期,并构造一个SQL语句。然后,您可以运行SQL语句。
或者,您可以使用其他一些数据类型(例如列表或JSON)将聚合值存储在一行中。