1. 程式人生 > 其它 >Hive讀取索引檔案問題:select * 和select count(*)讀取出來的行數不一致

Hive讀取索引檔案問題:select * 和select count(*)讀取出來的行數不一致

技術標籤:踩坑記錄Hivehadoop索引大資料hive

兩種方式,分別查詢資料有多少行:

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檔案無法切片