有一张桌子(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|
+--------+
答案 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开始)中都不是合法语法。那可能是一个蜂巢扩展。