为什么Distinct *不起作用,而count(Distinct *)起作用?

时间:2019-12-12 00:27:15

标签: mysql sql hive hiveql

有一张桌子(IN 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|
+--------+

如您所见,使用不同的(688919)后的计数与正常计数()(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|
+--------+

1 个答案:

答案 0 :(得分:3)

这样做的原因是在SQL中COUNT(*)COUNT(expr)的处理方式不同。来自MySQL manual

  

COUNT(*)有所不同,因为它返回的是   检索的行数,是否包含NULL值。

COUNT(DISTINCT expr)

期间
  

返回具有不同的非NULL 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开始)中都不是合法语法。那可能是一个蜂巢扩展。