【问题标题】:HIVE: Count distinct window function throws errorHIVE:计数不同的窗口函数会引发错误
【发布时间】:2019-07-01 18:35:32
【问题描述】:

我试图在 hive 中使用不同的窗口函数计数,并得到错误。

使用的查询如下:

select user,   dt, count(distinct dt) over(partition by user) as dates
FROM  table 

它会抛出以下错误:

FAILED: SemanticException [Error 10025]: Line 1:123 Expression not in GROUP BY key 'user'

我想我正在使用配置单元 language manual 中指定的语法

我到底做错了什么?

【问题讨论】:

  • 您需要在查询中添加 group by 子句才能使用 count 等聚合函数。
  • 我正在尝试将 count distinct 用作​​窗口函数而不是常规函数。给一个组是有效的,但它作为一个常规函数运行,忽略了over(partition by user) 部分。

标签: hadoop hive hiveql


【解决方案1】:

另一种解决方案是使用sizecollect_set 的组合:

select 
  user,
  dt,
  size(collect_set(dt) over(partition by user)) as dates
from
  table 

【讨论】:

  • 这是我一直在寻找的答案(2021 年)
【解决方案2】:

两种可能,

  1. 使用distinct时,不能在查询中选择userdt,删除userdt,查询将正常工作。

  2. 您不能在这种情况下使用distinct,如果您在上述查询中删除distinct,这将正常工作。如果您想获取不同的及其计数,可以进行如下子查询,

    select dates.distinct dt from (select dt, count(distinct dt) over(partition by user) as dates FROM table )

如果这有帮助,请告诉我。

【讨论】:

  • 这些建议有帮助,但它们需要额外的子查询或联接。我希望使用窗口函数获取数据,以便查询更快。但是现在我不确定 hive 是否支持 count distinct window 功能。
  • 它支持它..但你不能选择任何其他列。
  • 但是如果我无法选择任何其他列,我可以只使用普通的 count distinct 对吗?窗口计数不同功能有什么好处
  • 你的蜂巢版本是什么?根据文档Distinct 支持Hive 2.1.0 及更高版本。
  • 我的版本是1.2;这就解释了:(
【解决方案3】:

以下解决方案将像计数不同一样工作。 密集排名函数将为分区内的不同 c 提供排名。 最高的密集秩数将是 c 的不同条目的数量。 由于执行了两个窗口函数,所以性能最好的方式并不安静,但对我来说,这是让它在 Hive

select src.a, src.b, src.c, max(src.cnt_dens_rank) over ( PARTITION BY src.a, src.b) as cnt_distinct
from
(
select a, b, c, DENSE_RANK ( ) OVER (PARTITION BY a, b order by c) cnt_dens_rank
) src

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-09
    • 2016-10-23
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2021-06-26
    相关资源
    最近更新 更多