将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;
我的 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;