使用 hive 和 spark 选择 count(*) 问题

Posted

技术标签:

【中文标题】使用 hive 和 spark 选择 count(*) 问题【英文标题】:Select count(*) issue with hive and spark 【发布时间】:2018-09-12 15:18:54 【问题描述】:

运行 ANALYZE 语句后,我得到了正确的计数。 但我的问题是,每次更新计数时都需要运行它。从技术上讲,我应该能够更新同一分区的计数。

但如果我不执行 ANALYZE 语句,它会返回相同的计数。

这是我为更新计数而执行的查询。

ANALYZE TABLE bi_events_identification_carrier_sam PARTITION(year, month, day) COMPUTE STATISTICS;

而且执行起来一点也不方便。有什么想法吗?

【问题讨论】:

这里已经回答了这个问题:***.com/a/39914232/2700344。您可以在插入覆盖或关闭统计信息使用期间进行自动收集,并且每次都会扫描表。 HIVE select count(*) non null returns higher value than select count(*)的可能重复 count(*) 自 V0.14 以来在 Hive 设计 中被破坏 -- 与 Facebook 的座右铭 “快速失败,一直失败,大失败”一致 > 说真的,当你知道列 X 永远不会为空(但 SQL 优化器不会)时,你可以使用像 where X is null 这样的技巧 @Sam 你用什么引擎来写数据 - spark/hive? 【参考方案1】:

您的 count(*) 查询正在使用统计信息来获取结果。

如果你使用spark写数据,那么你可以设置spark.sql.statistics.size.autoUpdate.enabledtrue。这样可以确保 Spark 在写入完成后自动更新表统计信息。

如果你使用Hive,可以设置set hive.stats.autogather=true;

启用这些设置后,写入查询将自动更新统计信息,随后的读取查询将正常工作。

【讨论】:

我没有工作。它给出了相同的结果,并且只有在我再次使用 ANALYZE 语句时才有效。我是从 spark 写的。

以上是关于使用 hive 和 spark 选择 count(*) 问题的主要内容,如果未能解决你的问题,请参考以下文章

spark sql怎么去获取hive 表一定日期范围内的数据

无法从 spark 创建 Hive 表

使用 Spark 查询 hive 表

从 Hive 中的多个表中选择 count(*)

在 Spark 上打印查询 Hive 的物理计划

Mapreduce+Hive+Spark+Scala平台搭建