Loading more records than actual in HIve
从Hive表插入到HIve表时,正在加载比实际记录更多的记录。任何人都可以帮助解决Hive的这种怪异行为吗?
我的查询将如下所示:
1 2
| 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是分区文本表。而且两个表的行都以'\\代替
',用'\\\\ t'代替的字段
-
另请参阅:stackoverflow.com/a/39914232/2700344检查是否使用统计信息进行count(*)计算
-
使hive.compute.query.using.stats = false后,它将显示相同的记录数。但是您能解释一下为什么使用ture选项会发生这种情况吗?
-
解释。请看我的回答。
如果为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