有一张 table (在 HIVE)
示例 - meanalytics.key2_master_ids
该表有 6 列(cmpgn_id、offr_id、exec_id、creatv_id、cmpl_dt、mkt_cd)并且可能有重复(重复行)
现在这些是我运行的以下查询
1)hc.sql("Select count(*) from meanalytics.key2_master_ids").show()
- +--------+
|count(1)|
+--------+
| 688919|
+--------+
2)hc.sql("Select count(distinct *) from meanalytics.key2_master_ids").show()
|count(DISTINCT cmpgn_id, offr_id, exec_id, creatv_id, cmpl_dt, mkt_cd)|
+----------------------------------------------------------------------+
| 589808|
从这两个查询我推断该表有重复的行。
现在我使用不同的 * 选择不同的行并查看计数
3)hc.sql("Select count(*) from (Select distinct * from meanalytics.key2_master_ids)").show()
+--------+
|count(1)|
+--------+
| 688919|
+--------+
如您所见,使用 distinct (688919) 后的计数与正常 count()(688919) 相同,但当我使用 count(distinct *)(589808) 时,结果不同。请有人解释结果吗?
编辑 1)
还尝试通过提供所有 6 个列名来明确选择所有不同的值,即使在那之后计数是 688919 而不是 589808,这是我在计算时得到的(distinct *)
hc.sql("Select count(*) from (Select distinct cmpgn_id,offr_id,exec_id,creatv_id,cmpl_dt,mkt_cd from meanalytics.key2_master_ids)").show()
+--------+
|count(1)|
+--------+
| 688919|
+--------+
最佳答案
原因是 COUNT(*)
在 SQL 中的处理方式与 COUNT(expr)
不同。从 MySQL manual :
而 COUNT(DISTINCT expr)
因此,如果您有包含 NULL
值的行,COUNT(*)
将返回所有行,COUNT(*) FROM (SELECT DISTINCT * ...)
也将返回所有行(因为 SELECT DISTINCT *
将具有 NULL
值的行视为与具有非 NULL 值的行不同),但 COUNT(DISTINCT expr)
将仅计算具有非 NULL 值的行,因此给出较低的结果。
hive manual 表明它的行为方式相同。
请参阅此 demo on dbfiddle 以查看此操作与具有 NULL
值的某些行的表的操作。
请注意, COUNT(DISTINCT *)
在任何版本的 MySQL 中都不是合法的语法(至少从 5.5 开始)。这可能是一个 hive 扩展。
关于mysql - 为什么 Distinct * 不起作用但 count(Distinct *) 起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59296050/