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

Hadoop 配置单元计数(*)查询未调用mapreduce,hadoop,hive,Hadoop,Hive,我在配置单元中有外部表,我试图运行select count*from table_name查询,但查询会立即返回,并给出我认为已存储的结果。查询返回的结果不正确。是否有一种方法可以强制执行map reduce作业并每次执行查询 注意:并非所有外部表都遵循此行为,但其中一些表遵循此行为 使用的版本:Hive 0.14.0.2.2.6.0-2800、Hadoop 2.6.0.2.2.6.0-2800 Hortonworks对ORC数据进行wc-l操作不会给出准确的结果,因为数据是经过编码的。如果数据

我在配置单元中有外部表,我试图运行select count*from table_name查询,但查询会立即返回,并给出我认为已存储的结果。查询返回的结果不正确。是否有一种方法可以强制执行map reduce作业并每次执行查询

注意:并非所有外部表都遵循此行为,但其中一些表遵循此行为

使用的版本:Hive 0.14.0.2.2.6.0-2800、Hadoop 2.6.0.2.2.6.0-2800 Hortonworks

对ORC数据进行wc-l操作不会给出准确的结果,因为数据是经过编码的。如果数据以简单的文本文件格式存储,每行一行,那么这将起作用

配置单元不需要为ORC文件的count*启动MapReduce,因为它可以使用ORC元数据来确定总计数

使用orcfiledump命令从命令行分析ORC数据


根据个人经验,ORC表上的COUNT*通常返回错误的数字,即它只返回第一个数据文件上的行数。如果表格是由多个插入输入的,那么您将被卡住

在V0.13中,您可以通过添加一个虚拟where 1=1子句来愚弄优化器运行虚拟M/R作业,这需要更长的时间,但实际上会对行进行计数

使用0.14,优化器变得更加智能,您必须添加一个非确定性子句,例如MYKEY为null的地方。假设MYKEY是一个字符串,否则is null子句可能会使您的查询崩溃——这是另一个丑陋的ORC错误


顺便说一下,分区键上的SELECT DISTINCT也会返回错误的结果——所有现有分区都会显示出来,即使是空分区。这次不是针对ORC的。

经过一些研究,我找到了一种方法,可以启动MR来计算ORC表上的记录数

分析表“表名”分区“分区列”计算统计信息; -或 分析表“表名”计算统计信息

这不是count*的直接替代方法,但提供了表中记录的最新计数。

请尝试以下操作:


配置单元>在配置单元会话中设置配置单元.fetch.task.conversion=none,然后在配置单元会话中触发select count*操作,以强制mapreduce

为配置单元执行计数*,不需要MR作业。你能提供更多的细节来证明结果是错误的吗?我正在做行计数wc-l来检查行数,我的数据格式是orc,所以这是正确的检查方法吗?