配置单元计数(*)查询未调用mapreduce

mrphzbgm  于 2021-06-02  发布在  Hadoop
关注(0)|答案(4)|浏览(278)

我在配置单元中有外部表,我试图从表名称查询运行select count(*),但查询会立即返回,并给出我认为已存储的结果。查询返回的结果不正确。有没有办法强制执行map reduce作业并使查询每次都执行。
注意:并非所有外部表都遵循此行为,但其中一些表遵循此行为。
使用的版本:hive 0.14.0.2.2.6.0-2800、hadoop 2.6.0.2.2.6.0-2800(hortonworks)

jm2pwxwz

jm2pwxwz1#

根据个人经验,orc表上的count(*)通常返回错误的数字——即,它只返回第一个数据文件上的行数。如果表是由多个插入饲料那么你是卡住了。
在v0.13中,您可以通过添加一个伪“where1=1”子句来欺骗优化器运行一个伪m/r作业——这需要更长的时间,但实际上是对行进行计数。
使用0.14,优化器变得更聪明了,您必须添加一个不确定子句,例如“where mykey is null”。假设mykey是一个字符串,否则“isnull”子句可能会使查询崩溃——这是另一个丑陋的orc错误。
顺便说一句,select distinct on partition键也会返回错误的结果——所有现有分区都会显示出来,即使是空分区。这次不是针对兽人的。

5tmbdcev

5tmbdcev2#

请尝试以下操作:
在配置单元会话中设置hive.fetch.task.conversion=none,然后在配置单元会话中触发select count(*)操作以强制mapreduce

vd8tlhqk

vd8tlhqk3#

在一些发现之后,我得到了一个方法,可以启动mr来计算orc表上的记录数。
分析表'table name'分区('partition columns')计算统计信息--或分析表'表名'计算统计;
这不是count(*)的直接替代方法,而是提供表中记录的最新计数。

efzxgjgh

efzxgjgh4#

做一个 wc -l 在orc上的数据不会给你一个准确的结果,因为数据是经过编码的。如果数据以简单的文本文件格式(每行一行)存储,这将起作用。
hive不需要为orc文件的count(*)启动mapreduce,因为它可以使用orc元数据来确定总计数。
使用 orcfiledump 从命令行分析orc数据的命令
https://cwiki.apache.org/confluence/display/hive/languagemanual+orc#languagemanualorc-orcfiledumputility

相关问题