我在hdfs中有以下文件夹结构
/input/data/yyyy/mm/dd/
并在其中包含数据文件,例如:
/input/data/2013/05/01/
file_2013_05_01_01.json // file format yyyy_mm_dd_hh
file_2013_05_01_02.json // file format yyyy_mm_dd_hh
....
我已为此文件夹定义了hive外部表:
CREATE EXTERNAL TABLE input_data (
vr INT, ....
)
PARTITIONED BY (tsp STRING)
ROW FORMAT SERDE 'com.cloudera.hive.serde.JSONSerDe'
STORED AS TEXTFILE;
为每个文件夹添加一个分区,如下所示:
alter table input_data ADD PARTITION (tsp="2013-05-01") LOCATION '/input/data/2013/05/01/';
以下查询将日期2013-05-01
中的所有文件作为输入select ... from input_data where tps="2013-05-01"
如何只拍摄特定小时的文件?不更改hdfs结构,将每小时放在单独的文件夹中?
答案 0 :(得分:7)
您可以使用名为INPUT__FILE__NAME
的虚拟列。它是Hive 0.8.0及之后提供的2个两个虚拟列之一,表示映射器任务的输入文件名。所以你可以这样做:
select ... from input_data
where tps="2013-05-01"
and INPUT__FILE__NAME='file_2013_05_01_01.json';
HTH
答案 1 :(得分:3)
您可以使用以下构造:
SELECT
*
FROM
my_input_data
WHERE
INPUT__FILE__NAME LIKE '%hh.json';
此处hh
是您所需的小时,INPUT__FILE__NAME
是处理给定文件时可用于配置搜索查询的虚拟列。