将HDFS文件夹信息引入Hive external table

Introduce HDFS folder information into Hive external table

我的 HDFS 目录结构如下:

/home/date_1/A/file.txt
/home/date_1/B/file.txt
/home/date_2/A/file.txt
/home/date_2/B/file.txt
...

我可以创建外部 table

CREATE EXTERNAL TABLE table_name(col1 int, col2 string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORE AS TEXTFILE
LOCATION '/home'

但我不知道如何将文件夹信息'A'或'B'引入table。我能做什么?谢谢!

在 Hive 中,您有虚拟列,可用于读取底层文件名。 INPUT__FILE__NAME 将为您提供数据用于获取文件名的文件列表。

因此您需要先创建外部 table(正如您所做的那样)。然后在查询外部table时可以利用虚拟列拆分数据,如下:

select 
 col1,
 col2,
 INPUT__FILE__NAME as full_filepath,
 concat_ws("/",reverse(split(reverse(INPUT__FILE__NAME),"/")[1]), reverse(split(reverse(INPUT__FILE__NAME),"/")[0])) as splitted_filepath
 FROM
 table_name;

更多关于 virtual column in hive

您是否使用 MapReduce 作为 Hive 执行引擎?应该可以直接让框架遍历所有的子目录。

SET mapreduce.input.fileinputformat.input.dir.recursive=true;
SET hive.mapred.supports.subdirectories=true;
SELECT COUNT(1) FROM table_name;