如何使hive只将特定文件作为hdfs文件夹的输入

Jul*_*ias 5 hadoop hive

我在hdfs中有以下文件夹结构

  /input/data/yyyy/mm/dd/
Run Code Online (Sandbox Code Playgroud)

并在其中包含数据文件,例如:

/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
      ....
Run Code Online (Sandbox Code Playgroud)

我为这个文件夹定义了hive外部表:

CREATE EXTERNAL TABLE input_data (
    vr INT, ....
)
PARTITIONED BY (tsp STRING)
ROW FORMAT SERDE 'com.cloudera.hive.serde.JSONSerDe'
STORED AS TEXTFILE;
Run Code Online (Sandbox Code Playgroud)

为每个文件夹添加一个分区,如下所示:

   alter table input_data ADD PARTITION (tsp="2013-05-01") LOCATION '/input/data/2013/05/01/';
Run Code Online (Sandbox Code Playgroud)

以下查询将在日期2013-05-01中将所有文件作为输入

select ... from input_data where tps="2013-05-01"
Run Code Online (Sandbox Code Playgroud)

我怎样才能只获取特定小时的文件?不更改hdfs结构,将每小时放在单独的文件夹中?

Tar*_*riq 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';
Run Code Online (Sandbox Code Playgroud)

HTH