在 HIve 中加载比实际更多的记录

Posted

技术标签:

【中文标题】在 HIve 中加载比实际更多的记录【英文标题】:Loading more records than actual in HIve 【发布时间】:2016-12-04 13:22:16 【问题描述】:

从 Hive 表插入到 HIve 表时,它加载的记录比实际记录多。任何人都可以帮助解决 Hive 的这种奇怪行为吗?

我的查询将如下所示:

insert overwrite table_a
    select col1,col2,col3,... from table_b;

我的 table_b 包含 6405465 条记录。

从table_b插入到table_a后,发现table_a的记录总数为6406565。

有人可以帮忙吗?

【问题讨论】:

它们的存储方式不同吗?也许您在某些数据中有table_a 行分隔符 是的,table_b 是普通的文本表。其中 table_a 是分区文本表。并且两个表的行都由'\n'分隔,字段由'\t'分隔 另见:***.com/a/39914232/2700344 检查您是否使用统计信息进行计数(*)计算 在设置 hive.compute.query.using.stats=false 后,它会显示相同的记录数。但是你能用 ture 选项解释一下为什么之前会发生这种情况吗? 解释。请看我的回答。 【参考方案1】:

如果hive.compute.query.using.stats=true; 则优化器使用统计信息进行查询计算,而不是查询表数据。这要快得多,因为 Metastore 是一个像 mysql 一样的快速数据库,并且不需要 map-reduce。但是,如果未使用 INSERT OVERWRITE 或负责统计自动收集的配置参数 hive.stats.autogather 将表加载为 false,则统计信息可能不是新鲜的(陈旧的)。加载文件或使用第三方工具后,统计信息也不会新鲜。这是因为文件从未被分析过,metastore 中的统计数据不新鲜,如果你放了新文件,没人知道数据是如何变化的。同样在 sqoop 加载等之后。因此,在加载后使用“ANALYZE TABLE ... COMPUTE STATISTICS”收集表或分区的统计信息是一个好习惯。

如果无法自动收集统计信息(适用于 INSERT OVERWRITE)或运行ANALYZE 语句,那么最好关闭hive.compute.query.using.stats 参数。 Hive 将查询数据而不是使用统计信息。

参考:https://cwiki.apache.org/confluence/display/Hive/StatsDev#StatsDev-StatisticsinHive

【讨论】:

以上是关于在 HIve 中加载比实际更多的记录的主要内容,如果未能解决你的问题,请参考以下文章

在颤振加载中加载更多列表,但用户界面没有改变

如何在页面加载时从表中加载一定数量的行,并且仅在用户加载它们时才加载更多行?

Hive 外部表在 EMR 上返回不一致的结果

在 WordPress 中加载更多帖子 Ajax 按钮

我可以限制从 Hive 中的文件加载的记录数吗

如何使用 JSON API 在滚动时在 recyclerview 中加载更多数据