Hive:按日期(未知日期数)创建包含汇总数据的行
Hive: Create rows with summed data, by date (unknown number of dates)
我目前正在使用包含交易数据的 Hive Table,我需要对这些数据进行一些基本统计,并将结果放入新的 table.
编辑:我在 Hadoop 2.4.1 上使用 Hive 0.13。
上下文
首先,让我尝试显示输入 table:这是一个包含 3 列的 table、一个 ID、一个日期 (month/year) 和一个金额:
<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 分组的 table 组成,在每一行中我对每个相应月份的金额求和:
<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 ...
... ... ... ... ...
考虑到原始 table 有 >400 万个 ID 和 >5 亿行,超过 2 年。手动硬编码 table 似乎很难,因为我不知道应该创建多少列。
(我知道我有多少个不同的日期,但如果最初的 table 增长超过 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]
问题
您有什么建议可以:
- 如何遍历所有日期?
- 并且能够为我拥有的每个日期创建一个列,而无需为自己指定即将创建的列的名称?
- 在单个 HiveQL 脚本中是否可行? (没有义务,但可能真的很好)
我想避免使用 UDF,但目前我不确定它是否可以预防table,因为我还没有找到任何与我的情况相似的案例。
在此先致谢,欢迎随时询问更多信息。
评论太长了。
您无法在 Hive 中完全按照您的意愿行事,因为 SQL 查询在定义时必须具有固定数量的列。
你能做什么?
最简单的事情就是改变你想要的。产品多行而不是多列:
select id, date, sum(amount)
from table t
group by id, date;
然后您可以将数据加载到您最喜欢的电子表格中并在那里进行旋转。
其他选择。您可以编写一个查询,该查询将编写适当的查询。这将通过 table,确定可能的日期,并构建一个 SQL 语句。然后,您可以 运行 SQL 语句。
或者,您可以使用其他一些数据类型,例如列表或 JSON 将聚合值存储在一行中。
我目前正在使用包含交易数据的 Hive Table,我需要对这些数据进行一些基本统计,并将结果放入新的 table.
编辑:我在 Hadoop 2.4.1 上使用 Hive 0.13。
上下文
首先,让我尝试显示输入 table:这是一个包含 3 列的 table、一个 ID、一个日期 (month/year) 和一个金额:
<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 分组的 table 组成,在每一行中我对每个相应月份的金额求和:
<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 ...
... ... ... ... ...
考虑到原始 table 有 >400 万个 ID 和 >5 亿行,超过 2 年。手动硬编码 table 似乎很难,因为我不知道应该创建多少列。
(我知道我有多少个不同的日期,但如果最初的 table 增长超过 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]
问题
您有什么建议可以:
- 如何遍历所有日期?
- 并且能够为我拥有的每个日期创建一个列,而无需为自己指定即将创建的列的名称?
- 在单个 HiveQL 脚本中是否可行? (没有义务,但可能真的很好)
我想避免使用 UDF,但目前我不确定它是否可以预防table,因为我还没有找到任何与我的情况相似的案例。
在此先致谢,欢迎随时询问更多信息。
评论太长了。
您无法在 Hive 中完全按照您的意愿行事,因为 SQL 查询在定义时必须具有固定数量的列。
你能做什么?
最简单的事情就是改变你想要的。产品多行而不是多列:
select id, date, sum(amount)
from table t
group by id, date;
然后您可以将数据加载到您最喜欢的电子表格中并在那里进行旋转。
其他选择。您可以编写一个查询,该查询将编写适当的查询。这将通过 table,确定可能的日期,并构建一个 SQL 语句。然后,您可以 运行 SQL 语句。
或者,您可以使用其他一些数据类型,例如列表或 JSON 将聚合值存储在一行中。