有一张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|
+--------+
1条答案
按热度按时间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的延伸。