【问题标题】:Adding column to primary key removes uniqueness向主键添加列会消除唯一性
【发布时间】:2017-02-23 21:04:41
【问题描述】:

我有大约 3400 万行,每行在 tpc-ds dataset store_sales 表中有 23 列。

我有一个 composite primary keyss_item_skss_ticket_number

在运行查询 SELECT count(DISTINCT <primary key>) .. 时,我可以看到它输出了表中存在的总行数。

现在我在primary key 旁边添加另一列,即ss_sold_date_sk

在此之后,如果我运行countquery,我得到的打印行数比以前。有人可以通过示例向我解释为什么会发生这种情况吗?

TL;DR

向复合主键添加列何时会停止使其唯一?

【问题讨论】:

  • 我猜新列有NULL 值,这会抛出count(distinct)
  • @RyanVincent 是的,我确定。但正如 Gordon 所说,我刚刚意识到我的第三列有我以前没有注意到的空值。
  • @GordonLinoff 是的,你是对的。我刚刚注意到存在空值。谢谢!
  • 主键不允许有空列?
  • @RyanVincent 是的,你是对的。我试图找到唯一的列以便将它们设置为主键,并且想知道为什么 select count.. 查询在添加另一列后会减少数字。

标签: sql hive impala tpc


【解决方案1】:

演示

create table mytable (c1 string,c2 string);
insert into mytable values ('A','A'),('B',null),('C',null);

select count(distinct c1) as count_distinct from mytable;

+----------------+
| count_distinct |
+----------------+
|              3 |
+----------------+

如预期 - 3 个不同的值 - 'A'、'B' 和 'C'


select count(distinct concat(c1,c2)) as count_distinct from mytable;

+----------------+
| count_distinct |
+----------------+
|              1 |
+----------------+
    

正如预期的那样。为什么? - 查看下一个查询


select c1,c2,concat(c1,c2) as concat_c1_c2 from mytable;

+----+------+--------------+
| c1 |  c2  | concat_c1_c2 |
+----+------+--------------+
| A  | A    | AA           |
| B  | NULL | NULL         |
| C  | NULL | NULL         |
+----+------+--------------+

与 NULL 连接产生 NULL


select count(distinct c1,c2) as count_distinct from mytable;

+----------------+
| count_distinct |
+----------------+
|              1 |
+----------------+

BUG!!


这是一个解决该错误的方法:

select count(distinct struct(c1,c2)) as count_distinct from mytable;

+----------------+
| count_distinct |
+----------------+
|              3 |
+----------------+

【讨论】:

  • 恕我直言,它按记录工作: *COUNT(DISTINCT expr,[expr...]) 返回具有不同非 NULL expr 值的行数的计数。 *
  • @dnoeth - 首先,我现在可以更改文档。 :-) 其次,UDF 文档 (cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF‌​) 声明“count(DISTINCT expr[, expr]) - 返回所提供表达式的行数) 是唯一的且非 NULL。”。它没有说明,也没有您的引述,all 一行中的表达式应该是非 NULL。
  • 最重要的是——如果select distinct ... 将列的组合视为不同,那么select count ( distinct ...) 也应该如此——因此存在错误
  • 标准 SQL 没有在多个列上定义 COUNT(DISTINCT ),因此供应商可能可以实现最适合他的任何东西 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多