Hive:按日期(未知日期数)创建包含汇总数据的行

时间:2015-07-30 13:44:01

标签: sql hadoop hive data-manipulation

我目前正在使用包含交易数据的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]

问题

你有什么建议可以:

  1. 如何循环所有日期?
  2. 能够为我所拥有的每个日期创建一个列,而无需指定即将创建的列的名称吗?
  3. 是否可以在单个HiveQL脚本中使用? (没有义务,但可能真的很好)
  4. 我想避免使用UDF,但在这一点上我不确定它是否可以预防,因为我没有发现任何重新组合我的情况。

    提前致谢,不要犹豫,询问更多信息。

1 个答案:

答案 0 :(得分:0)

评论太长了。

您无法在Hive中完成所需的操作,因为SQL查询在定义时必须具有固定数量的列。

你能做什么?

最简单的方法就是改变你想要的东西。产品多行而不是多列:

select id, date, sum(amount)
from table t
group by id, date;

然后,您可以将数据加载到您喜欢的电子表格中并将其转移到那里。

其他替代方案。您可以编写一个将编写相应查询的查询。这将遍历表,识别可能的日期,并构造一个SQL语句。然后,您可以运行SQL语句。

或者,您可以使用其他一些数据类型(例如列表或JSON)将聚合值存储在一行中。