Hive讀取索引檔案問題:select * 和select count(*)讀取出來的行數不一致
阿新 • • 發佈:2021-02-05
兩種方式,分別查詢資料有多少行:
hive (gmall)> select * from ods_log;
Time taken: 0.706 seconds, Fetched: 2955 row(s)
hive (gmall)> select count(*) from ods_log;
2959
兩次查詢結果不一致的原因分析
hive (gmall)>
drop table if exists ods_log;
CREATE EXTERNAL TABLE ods_log (`line` string)
PARTITIONED BY (`dt` string) -- 按照時間建立分割槽
STORED AS -- 指定儲存方式,讀資料採用LzoTextInputFormat;
INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '/warehouse/gmall/ods/ods_log' -- 指定資料在hdfs上的儲存位置
;
這是當時建立表時的語句,指定了儲存格式為lzo,然後執行了為lzo檔案建立索引的命令
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer -Dmapreduce.job.queuename=hive /warehouse/gmall/ods/ods_log/dt=2020-06-14
所以在HDFS上的hive裡存著lzo格式資料和lzo.index索引檔案,這便於對檔案進行切片。
- 但是
select * from ods_log
不執行MR操作,預設採用的是ods_log建表語句中指定的DeprecatedLzoTextInputFormat
lzo.index
為索引檔案。 select count(*) from ods_log
執行MR操作,預設採用的是CombineHiveInputFormat
,不能識別lzo.index
為索引檔案,將索引檔案當做普通檔案處理。更嚴重的是,這會導致LZO檔案無法切片。