5

我在 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
      ....

我为此文件夹定义了配置单元外部表:

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 结构以将每个小时放在单独的文件夹中?

4

2 回答 2

7

您可以使用一个名为INPUT__FILE__NAME. 它是 Hive 0.8.0 及更高版本提供的两个虚拟列之一,表示映射器任务的输入文件名称。所以你可以做这样的事情:

select ... from input_data 
where tps="2013-05-01" 
and INPUT__FILE__NAME='file_2013_05_01_01.json';

高温高压

于 2013-05-30T20:39:33.593 回答
3

您可以使用以下构造:

SELECT 
   *
FROM
   my_input_data
WHERE
   INPUT__FILE__NAME LIKE '%hh.json';

hh是您想要的时间,并且INPUT__FILE__NAME是在处理给定文件时可用于配置单元查询的虚拟列。

于 2013-05-30T20:43:34.050 回答