hive:按日期(未知日期数)创建包含求和数据的行

wpx232ag  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(322)

我目前正在使用一个包含事务数据的配置单元表,我需要对这些数据进行一些基本统计,并将结果放入一个新表中。
编辑:我正在Hadoop2.4.1上使用Hive0.13。
上下文
首先,让我尝试呈现输入表:这是一个包含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和>5亿行,超过2年。手工对表进行硬编码似乎相当困难,因为我不知道应该创建多少列。
(我知道我有多少个不同的日期,但如果原来的表增长超过5年,10年,15年,将有很多要做的手,这是有风险的。)
挑战
我知道如何做一些基本的操作和分组,我甚至可以做一些情况下,但我的问题是,我不能创建这样的列(如上所述)。。。

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]

问题
你有什么建议可以:
我怎样才能把所有的日期循环一遍?
并且能够为我拥有的每个日期创建一个列,而不必指定即将创建的列的名称?
在单个hiveql脚本中是否可行(没有义务,但可以非常好)
我想避免udf,但在这一点上,我不确定它是可以预防的,因为我还没有找到任何情况下,我的。
提前感谢,请随时询问更多信息。

yfwxisqw

yfwxisqw1#

这太长了,不能发表评论。
您不能在配置单元中完全执行所需的操作,因为sql查询在定义时必须具有固定的列数。
你能做什么?
最简单的事情就是改变你想要的。生成多行而不是多列:

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

然后,您可以将数据加载到您最喜爱的电子表格中,并在那里进行数据透视。
其他选择。您可以编写一个查询来编写适当的查询。这将遍历表,确定可能的日期,并构造一个sql语句。然后可以运行sql语句。
或者,您可以使用其他一些数据类型,例如list或json,将聚合值存储在一行中。

相关问题