【问题标题】:Hive: Create rows with summed data, by date (unknown number of dates)Hive:按日期创建包含汇总数据的行(日期数未知)
【发布时间】:2015-07-30 13:44:00
【问题描述】:

我目前正在使用包含交易数据的 Hive 表,我需要对这些数据进行一些基本统计,并将结果放入新表中。

编辑:我在 Hadoop 2.4.1 上使用 Hive 0.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       ...
...       ...         ...         ...        ...

考虑到原始表在超过 2 年的时间里有 >400 万个 ID 和 >5 亿行。手动硬编码表格似乎很难,因为我不知道应该创建多少列。

(我知道我有多少个不同的日期,但如果原始表增长了 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 脚本中是否可行? (没有义务,但可能真的很好)

我想避免 UDF,但目前我不确定它是否可以预防,因为我没有找到任何与我相似的案例。

在此先感谢您,请随时询问更多信息。

【问题讨论】:

  • 在 SQL Server 中,PIVOT 函数会执行此操作。你在用什么?
  • 我在 Hadoop (MapR M5) 平台 2.4.1 上使用 Hive/Pig 0.13。我可以在命令行中或使用 HUE 运行 Hive 脚本。

标签: sql hadoop hive data-manipulation


【解决方案1】:

评论太长了。

您无法在 Hive 中完全按照自己的意愿行事,因为 SQL 查询在定义时必须具有固定数量的列。

你能做什么?

最简单的事情就是改变你想要的。产品多行而不是多列:

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

然后,您可以将数据加载到您喜欢的电子表格中并在那里进行透视。

其他选择。您可以编写一个查询来编写相应的查询。这将遍历表,确定可能的日期,并构造一个 SQL 语句。然后就可以运行 SQL 语句了。

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

【讨论】:

  • 我喜欢改变我想要的东西的想法!我将尝试生成多行而不是列。由于我有一个庞大的数据集,我将无法在电子表格中旋转表格,我也必须在 Hive(或者可能是 Pig)中进行。您对此有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多