問(wèn)題1:Hive一條Select語(yǔ)句,底層是如何讀取HDFS文件的?
-
基本流程
- step1:根據(jù)表名到Hive元數(shù)據(jù)中,找到這個(gè)表對(duì)應(yīng)的HDFS地址
- step2:將對(duì)應(yīng)的HDFS地址目錄中所有數(shù)據(jù)進(jìn)行讀取處理
-
==舉個(gè)栗子1:普通表查詢==
select * from tb_emp;
a. Hive會(huì)在MySQL元數(shù)據(jù)庫(kù)中找到一張TBLS的表:這張表存儲(chǔ)了Hive中每張表的信息
-
b. Hive會(huì)根據(jù)表名找到這張Hive表對(duì)應(yīng)的SD_ID
[圖片上傳失敗...(image-1be2f0-1658200618304)]
c. Hive會(huì)在MySQL元數(shù)據(jù)庫(kù)中找到一張SDS的表:這張表存儲(chǔ)了Hive表與HDFS的對(duì)應(yīng)關(guān)系
-
d. Hive會(huì)根據(jù)表名對(duì)應(yīng)的SD_ID在SDS中表中找到表對(duì)應(yīng)的HDFS地址
[圖片上傳失敗...(image-c16d96-1658200618304)]
e. Hive會(huì)讀取這個(gè)目錄下的所有文件
-
==舉個(gè)栗子2:分區(qū)表查詢==
select * from tb_emp_part where dept = 10; -- dept是分區(qū)字段
a. Hive會(huì)在MySQL元數(shù)據(jù)庫(kù)中找到一張TBLS的表:這張表存儲(chǔ)了Hive中每張表的信息
-
b. Hive發(fā)現(xiàn)這張表為分區(qū)表,并且做了分區(qū)過(guò)濾,就先從TBLS中讀取表的TBL_ID
[圖片上傳失敗...(image-848c94-1658200618304)]
c. Hive會(huì)在MySQL元數(shù)據(jù)庫(kù)中找到一張PARTITIONS的表:這張表存儲(chǔ)了Hive中每個(gè)表的每個(gè)分區(qū)的信息
-
d. Hive會(huì)根據(jù)TBL_ID荣挨,找到這張表的所有分區(qū)的信息
[圖片上傳失敗...(image-391470-1658200618304)]
e. Hive根據(jù)這個(gè)表每個(gè)分區(qū)的名稱(chēng)進(jìn)行過(guò)濾,獲取需要過(guò)濾的分區(qū)的SD_ID
-
f. Hive根據(jù)這個(gè)SD_ID到SDS表中朴摊,獲取這個(gè)分區(qū)在HDFS中對(duì)應(yīng)的地址
[圖片上傳失敗...(image-ea865a-1658200618304)]
問(wèn)題2:有一張Hive表db_test.tb_test1默垄,是一張普通表
-
表在HDFS中的目錄
/user/hive/warehouse/db_test.db/tb_test1
-
如果我通過(guò)hdfs命令手動(dòng)往這個(gè)表的目錄中放一個(gè)文件
hdfs dfs -put 1.txt /user/hive/warehouse/db_test.db/tb_test1
-
請(qǐng)問(wèn)表中select是否能讀到這個(gè)文件的數(shù)據(jù)?
可以甚纲,根據(jù)Hive映射原理口锭,Hive會(huì)直接讀取這個(gè)表對(duì)應(yīng)的HDFS目錄,只要是目錄下的文件都會(huì)被讀取
問(wèn)題3:有一張Hive表db_test.tb_test2介杆,是一張分區(qū)表
-
表在HDFS中的目錄結(jié)構(gòu)
/user/hive/warehouse/db_test.db/tb_test2/daystr=2022-01-01/20220101.txt /daystr=2022-01-02/20220102.txt ……
-
問(wèn)題:如果手動(dòng)在HDFS的這個(gè)目錄中創(chuàng)建一個(gè)分區(qū)的目錄鹃操,然后將數(shù)據(jù)放入這個(gè)分區(qū)目錄中
hdfs dfs -mkdir /user/hive/warehouse/db_test.db/tb_test2/daystr=2022-03-28 hdfs dfs -put 20220328.txt /user/hive/warehouse/db_test.db/tb_test2/daystr=2022-03-28
-
請(qǐng)問(wèn)Hive中能否讀到這個(gè)分區(qū)?
不能春哨,因?yàn)楦鶕?jù)分區(qū)表的元數(shù)據(jù)映射荆隘,這個(gè)分區(qū)目錄必須在元數(shù)據(jù)中有才能被讀到,而這個(gè)分區(qū)目錄是用戶自己創(chuàng)建的赴背,Hive中沒(méi)有對(duì)應(yīng)的元數(shù)據(jù)所以椰拒,讀取不到的
-
解決:手動(dòng)添加這個(gè)分區(qū)的元數(shù)據(jù)
alter table tb_test2 add if not exists partition (daystr=2022-03-28);