如何摆脱 Hive/Impala 中的重复计数

Posted

技术标签:

【中文标题】如何摆脱 Hive/Impala 中的重复计数【英文标题】:How to Get Rid of Duplicate Counts in Hive/Impala 【发布时间】:2021-03-02 19:02:12 【问题描述】:

我正在尝试计算 Impala/Hive 中三个表的特定列的总值,但我似乎只能获得每个表的总值。例如,我收到的是每张桌子的波兰计数,而不是所有三张桌子组合的波兰计数。我曾尝试将这些表合并在一起,但没有成功。下面列出的是我使用的编码。

SELECT table1.country, COUNT(*)  
FROM table1 
GROUP BY table1.country  
UNION 
SELECT table2.country, COUNT(*) 
FROM table2 
GROUP BY table2.country 
UNION 
SELECT table3.country, COUNT(*)  
FROM table3
GROUP BY table3.country
ORDER BY COUNT(country) DESC;

【问题讨论】:

【参考方案1】:

使用UNION ALL 代替UNION

SELECT table1.country, COUNT(*)  
FROM table1 
GROUP BY table1.country  
UNION ALL
SELECT table2.country, COUNT(*) 
FROM table2 
GROUP BY table2.country 
UNION ALL
SELECT table3.country, COUNT(*)  
FROM table3
GROUP BY table3.country
ORDER BY COUNT(country) DESC;

UNION 删除重复项,因此如果两个表在一个国家/地区的计数相同,则删除重复项。

编辑:

如果您希望每个国家/地区有一行,请使用子查询并重新聚合:

SELECT country, SUM(cnt)
FROM (SELECT table1.country, COUNT(*) as cnt
      FROM table1 
      GROUP BY table1.country  
      UNION ALL
      SELECT table2.country, COUNT(*) 
      FROM table2 
      GROUP BY table2.country 
      UNION ALL
      SELECT table3.country, COUNT(*)  
      FROM table3
      GROUP BY table3.country
     ) t
GROUP BY country;

【讨论】:

不幸的是,我收到了同样的结果。 @KarlYujeck 。 . .如果波兰不在所有表格中,也会发生这种情况。 我遇到的最大问题是重复计数。我需要帮助删除重复项。 它通常更透明地优化到UNION ALL 所有表然后在所有数据集上执行COUNT 而不是总结单个计数(如我所见,例如,对于 Oracle 和 Postgres,但不能讲述黑斑羚) @astentx 。 . .实际上,在大多数数据库中,我认为这不是真的,原因有两个。首先,对较小数据的多次聚合可能比对较大数据的一次聚合更快(由于聚合算法的 O(n log n) 特性)。其次,个人分组更有可能使用索引(这对 Hive 来说不是问题)。 Oracle 有一个非常聪明的优化器,所以它可以在那里工作。但我一般不会说 union all 后跟聚合会有更好的性能。

以上是关于如何摆脱 Hive/Impala 中的重复计数的主要内容,如果未能解决你的问题,请参考以下文章

使用python如何摆脱从网站上抓取的文本中的尾随空格[重复]

我该如何摆脱 - 警告:列表中的每个孩子都应该有一个唯一的“关键”道具[重复]

如何在 Spark Scala 中的 Schema RDD [从案例类中创建] 中查找重复项以及相应的重复计数?

摆脱python中的零[重复]

如何安装Tableau并连接CDH的Hive/Impala

如何摆脱div之间的空间[重复]