sql - 配置单元:按日期(未知日期数)创建包含汇总数据的行

标签 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       ...
...       ...         ...         ...        ...

考虑到原始表在超过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]

问题

您有什么建议可以:
  • 如何遍历所有日期?
  • 是否能够为我拥有的每个日期创建一个列,而无需指定自己即将创建的列的名称?
  • 是否可以在单个HiveQL脚本中执行? (不是必须的,但可能真的很好)

  • 我想避免使用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/

    相关文章:

    hadoop - 嵌入式模式下的 Spark - 未找到用户/配置单元/仓库

    mysql - 在mysql中检索结果并格式化

    mysql - SQL - 显示满足多个条件中的 2 个或更多条件的记录

    windows - Pig 0.13.0 在 Windows 8 上的安装

    hadoop - Hadoop如何在各个数据节点的硬盘上写入数据?

    hive - 使用 Amazon Athena 和 Open JSONx Serde 处理重复 key

    hadoop - Hive始终以本地模式运行

    sql - Mysql 日期时间查询

    mysql - SQL - 来自 3 个表的结果,聚合函数

    hadoop - 对于简单的 O(n) 复杂度查询,是否有比 Hadoop 更好的解决方案?