为什么distinct*不工作,而count(distinct*)工作?

6gpjuf90  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(441)

有一张table(在 hive 里)
示例-meanalytics.key2\u master\u id
此表有6列(cmpgn\u id、offr\u id、exec\u id、creav\u id、cmpl\u dt、mkt\u 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|

从这两个查询中,我推断表中有重复的行。
现在我使用distinct*选择distinct行并查看计数

3)hc.sql("Select count(*) from (Select distinct * from meanalytics.key2_master_ids)").show()
+--------+
|count(1)|
+--------+
|  688919|
+--------+

如您所见,使用distinct(688919)后的计数是相同的正常计数()(688919),但当我使用count(distinct*)(589808)时是不同的。有人能解释一下结果吗?
edit1)还尝试通过提供所有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|
+--------+
9udxz4iz

9udxz4iz1#

原因是 COUNT(*) 被区别对待 COUNT(expr) 在sql中。从mysql手册:
count(*)有些不同,因为它返回检索到的行数的计数,不管它们是否包含空值。
COUNT(DISTINCT expr) 返回具有不同非空expr值的行数的计数。
所以如果你和 NULL 价值观, COUNT(*) 将返回所有行 COUNT(*) FROM (SELECT DISTINCT * ...) (自 SELECT DISTINCT * 将行处理为 NULL 值与具有非空值的值不同),但是 COUNT(DISTINCT expr) 将只对具有非空值的行计数,因此给出较低的结果。
Hive手册显示,它的行为方式相同。
请参阅dbfiddle上的这个演示,以了解如何使用带有 NULL 价值观。
请注意 COUNT(DISTINCT *) 在mysql的任何版本中都不是合法的语法(至少从5.5开始)。那可能是Hive的延伸。

相关问题