count(*)查询的行为不同

zf2sa74q  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(318)

我运行了两个查询,从按流程日期字段分区的配置单元托管表中获取两个不同日期的记录数。

  1. SELECT COUNT(1) FROM prd_fct.mktng WHERE process_dt='2018-01-01' --returned 2 million
  2. SELECT COUNT(1) FROM prd_fct.mktng WHERE process_dt='2018-01-02' --returned 3 million

但如果我用 UNION ALL 子句返回的计数与上述单个查询的计数不同。

  1. SELECT '2018-01-01', COUNT(1) FROM prd_fct.mktng WHERE process_dt='2018-01-01'
  2. UNION ALL
  3. SELECT '2018-01-02', COUNT(1) FROM prd_fct.mktng WHERE process_dt='2018-01-02'

造成这种差异的根本原因是什么?

0dxa2lsx

0dxa2lsx1#

我们的一个队友帮我们找出了问题所在。当我们运行一个count()查询时,查询不是在表上实际执行的,而是从统计数据中获取count。补救方法之一是收集表agian上的stats,然后单个表上的count()将反映实际的count
你好,阿诺普

olqngx59

olqngx592#

我也面临着类似的问题 count(*) 返回不正确的计数。我添加了下面的代码和计数现在是一致的。
对于非分区表使用:

  1. ANALYZE TABLE your_table_name COMPUTE STATISTICS

对于分区表,通过指定分区值来分析最近添加的分区:

  1. ANALYZE TABLE your_table_name
  2. PARTITION(your_partition_name=your_partition_value)
  3. COMPUTE STATISTICS;

相关问题