我目前正在使用包含交易数据的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 ...
... ... ... ... ...
考虑到原始表在超过2年的时间内具有> 400万个ID和5亿行。手动对表进行硬编码似乎很困难,因为我不知道应该创建多少列。
(我知道我有多少个不同的日期,但是如果原始表格增长到5年,10年,15年,那么手工将要做很多事情,这是有风险的。)
挑战
我知道如何进行一些基本的操作和GROUP BY,甚至可以在某些情况下进行CASE,但是问题中最棘手的部分是我无法创建像这样的列(如上所述)...
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,但目前还不确定它是否可以预防,因为我还没有发现任何类似的情况。
预先感谢,不要犹豫,索取更多信息。
最佳答案
这个评论太长了。
您不能完全在Hive中完成所需的操作,因为定义SQL查询时,它必须具有固定数量的列。
你能做什么?
最简单的事情就是更改您想要的内容。产品多行而不是多列:
select id, date, sum(amount)
from table t
group by id, date;
然后,您可以将数据加载到您喜欢的电子表格中并在其中进行数据透视。
其他选择。您可以编写查询,该查询将编写适当的查询。这将遍历表格,确定可能的日期,并构造一个SQL语句。然后,您可以运行SQL语句。
或者,您可以使用其他一些数据类型(例如列表或JSON)将汇总值存储在一行中。
关于sql - 配置单元:按日期(未知日期数)创建包含汇总数据的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31725478/