根据个人经验,orc表上的count(*)通常返回错误的数字——即,它只返回第一个数据文件上的行数。如果表是由多个插入饲料那么你是卡住了。 在v0.13中,您可以通过添加一个伪“where1=1”子句来欺骗优化器运行一个伪m/r作业——这需要更长的时间,但实际上是对行进行计数。 使用0.14,优化器变得更聪明了,您必须添加一个不确定子句,例如“where mykey is null”。假设mykey是一个字符串,否则“isnull”子句可能会使查询崩溃——这是另一个丑陋的orc错误。 顺便说一句,select distinct on partition键也会返回错误的结果——所有现有分区都会显示出来,即使是空分区。这次不是针对兽人的。
4条答案
按热度按时间jm2pwxwz1#
根据个人经验,orc表上的count(*)通常返回错误的数字——即,它只返回第一个数据文件上的行数。如果表是由多个插入饲料那么你是卡住了。
在v0.13中,您可以通过添加一个伪“where1=1”子句来欺骗优化器运行一个伪m/r作业——这需要更长的时间,但实际上是对行进行计数。
使用0.14,优化器变得更聪明了,您必须添加一个不确定子句,例如“where mykey is null”。假设mykey是一个字符串,否则“isnull”子句可能会使查询崩溃——这是另一个丑陋的orc错误。
顺便说一句,select distinct on partition键也会返回错误的结果——所有现有分区都会显示出来,即使是空分区。这次不是针对兽人的。
5tmbdcev2#
请尝试以下操作:
在配置单元会话中设置hive.fetch.task.conversion=none,然后在配置单元会话中触发select count(*)操作以强制mapreduce
vd8tlhqk3#
在一些发现之后,我得到了一个方法,可以启动mr来计算orc表上的记录数。
分析表'table name'分区('partition columns')计算统计信息--或分析表'表名'计算统计;
这不是count(*)的直接替代方法,而是提供表中记录的最新计数。
efzxgjgh4#
做一个
wc -l
在orc上的数据不会给你一个准确的结果,因为数据是经过编码的。如果数据以简单的文本文件格式(每行一行)存储,这将起作用。hive不需要为orc文件的count(*)启动mapreduce,因为它可以使用orc元数据来确定总计数。
使用
orcfiledump
从命令行分析orc数据的命令https://cwiki.apache.org/confluence/display/hive/languagemanual+orc#languagemanualorc-orcfiledumputility