【问题标题】:SQL/Hive count distinct columnSQL/Hive 计数不同的列
【发布时间】:2013-08-08 03:43:49
【问题描述】:

如何在 Hive 中执行此操作?

    columnA       columnB    columnC
     100.10      50.60       30
     100.10      50.60       30
     100.10      50.60       20
     100.10      70.80       40

输出应该是:

  columnA   columnB    No_of_distinct_colC
  100.10    50.60       2
  100.10    70.80       1

我认为正确的查询:

SELECT columnA,columnB,COUNT(distinct column C)
from table_name
group by columnA,columnB

这是正确的吗? SQL也不错。

更新:如何找到 columnC 的标准差?尽快需要这个。

【问题讨论】:

  • 是的,您的 SQL 看起来不错。
  • 查询看起来不错,但使用COUNT(DISTINCT(X)) 可能不会给出最有效的执行结果。另请参阅此答案:stackoverflow.com/questions/8762064/…

标签: sql hive


【解决方案1】:

是的,它几乎是正确的。但是你有一个简单的错误。您的列名在 COUNT 中是错误的。

SELECT columnA,columnB,COUNT(DISTINCT columnC) No_of_distinct_colC
from table_name
group by columnA,columnB

【讨论】:

  • 看起来您缺少 columnC 的 distinct。
  • 你真的需要独特的吗?我不这么认为。它应该按预期工作。
  • "count(expr) - 返回提供的表达式为非 NULL 的行数;count(DISTINCT expr[, expr]) - 返回提供的表达式的行数( s) 是唯一的且非 NULL。” cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
  • 如果没有DISTINCT,则查询将返回一行“100.10, 50.60, 3”(A 和 B 分别为 100.10、50.60 三行),而要求是返回“100.10, 50.60, 2"(因为前两行的 C 值相同)。
  • @AgentSQl:这不是我做的吗? COUNT(DISTINCT columnC)?
【解决方案2】:
SELECT * 
FROM
(
    SELECT columnA, columnB, COUNT(DISTINCT column C) AS dis_col
    FROM table_name
    GROUP BY columnA, columnB
) A;

【讨论】:

  • 内部查询会正确,为什么需要外部SELECT * 查询?
  • 要扩展上一条评论,您没有理由需要从外部查询中选择*内部查询。这就像说只买红杯,然后买你刚拿到的所有杯子。
【解决方案3】:

如果您使用 PySpark,以下代码应该可以工作:

import pyspark.sql.functions as F
spark.sql('select * from table_name')\
         .groupby(columnA, columnB)\
         .agg(F.countDistinct('columnC') ).show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多