Impala:在执行 group by 聚合函数之前更改列类型

Posted

技术标签:

【中文标题】Impala:在执行 group by 聚合函数之前更改列类型【英文标题】:Impala: change the column type prior to perform the aggregation function for group by 【发布时间】:2016-09-20 20:01:04 【问题描述】:

我有一张桌子,my_table:

transaction_id    |   money     |  team
--------------------------------------------
    1             |   10        |   A
    2             |   20        |   B
    3             |   null      |   A
    4             |   30        |   A
    5             |   16        |   B
    6             |   12        |   B

当我按团队分组时,我可以通过查询计算最大值,最小值:

select team, max(money), min(money) from my_table group by team

但是,我不能做 avg 和 sum 因为有空值。即:

select team, avg(money), sum(money) from my_table group by team

会失败。

有没有办法在计算 avg 和 sum 之前更改列类型?即我希望输出为:

team   |  avg(money)   |  sum(money)
--------------------------------------
 A     |  20           |  40
 B     |  16           |  48

谢谢!

【问题讨论】:

我对 Impala 不熟悉,但 SQL 已经可以按照您的要求运行。 Impala 有 COALESCE 或 NULLIF 函数吗?您可以使用零作为 SUM。处理 AVG 会比较棘手。 文档说,Rows with a NULL value for the specified column are ignored,既适用于sum,也适用于avg 提问前是否测试了查询? @sstan: 这是我得到的错误:HiveServer2Error: AnalysisException: AVG requires a numeric or timestamp parameter: avg(money) 或者如果没有在桌子?谢谢! 你是说money不是数字吗?那么为什么你的问题给人的印象是,唯一的问题是null 值?您应该编辑您的问题,以便更清楚地了解您的实际问题是什么。 【参考方案1】:

根据 Cloudera 提供的文档,您的查询应该按原样工作。 AVG Function 和 SUM Function忽略null。

SELECT team, AVG(money), SUM(money)
FROM my_table
GROUP BY team

更新:根据您的评论,我再次对 Impala 不熟悉。大概标准 SQL 会起作用。您的错误似乎是数据类型问题。

SELECT team, AVG(CAST(money AS INT)), SUM(CAST(money AS INT))
FROM my_table
GROUP BY team

【讨论】:

这是我得到的错误:HiveServer2Error: AnalysisException: AVG requires a numeric or timestamp parameter: avg(money) 或者如果在表中没有这样定义,我如何将钱视为数字?谢谢!【参考方案2】:

只需将总和除以计数即可:

SELECT team, SUM(money)/COUNT(money) AS AVG, SUM(money)
FROM team
GROUP BY team

在这里测试:http://sqlfiddle.com/#!9/ba381/4

【讨论】:

以上是关于Impala:在执行 group by 聚合函数之前更改列类型的主要内容,如果未能解决你的问题,请参考以下文章

Hive之GROUP BY详解

SQL中只要用到聚合函数就一定要用到group by 吗?

mysql 可以group by 两个字段吗

mysql group by 能用到索引么

使用 GROUP BY 功能在 ADO.NET 中聚合函数

BigQuery 和 GROUP BY 子句