有一张 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/

10-16 01:27