如何将一个Hive表指向多个外部文件?

时间:2015-02-07 01:40:51

标签: hadoop hive hdfs

我希望能够将多个HDFS文件附加到一个Hive表,同时将HDFS文件保留在其原始目录中。创建的这些文件位于不同的目录中。

LOAD DATA INPATH将HDFS文件移动到配置单元仓库目录。

据我所知,外部表必须指向一个文件,或指向一个目录,在该目录中可以放置具有相同模式的多个文件。但是,我的文件不会位于单个目录下。

是否可以将单个Hive表指向单独目录中的多个外部文件,或者将多个文件复制到单个hive表中而不将文件从其原始HDFS位置移动?

Pradeep的答案扩大解决方案

例如,我的文件如下所示:

/root_directory/<job_id>/input/<dt>

假装每个的架构是(foo STRING,bar STRING,job_id STRING,dt STRING)

我首先创建一个外部表。但请注意,我的DDL不包含初始位置,并且不包含job_id和dt字段:

CREATE EXTERNAL TABLE hivetest (
foo STRING,
bar STRING
) PARTITIONED BY (job_id STRING, dt STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
;

我想说我希望插入两个文件位于:

/root_directory/b1/input/2014-01-01
/root_directory/b2/input/2014-01-02

我可以将这两个外部文件加载到同一个Hive表中,如下所示:

ALTER TABLE hivetest 
ADD PARTITION(job_id = 'b1', dt='2014-01-01')
LOCATION '/root_directory/b1/input/2014-01-01';

ALTER TABLE hivetest 
ADD PARTITION(job_id = 'b2', dt='2014-01-02')
LOCATION '/root_directory/b2/input/2014-01-02';

如果有人碰巧需要使用Talend来执行此操作,他们可以像这样使用tHiveLoad组件[编辑:这不起作用;检查下面]:

Matthew Moisen Hive Talend Insert

使用tHiveLoad为此生成的代码talend实际上是LOAD DATA INPATH ...,它会将文件从HDFS中的原始位置删除。

您必须在tHiveLoad中执行更早的ALTER TABLE语法。

2 个答案:

答案 0 :(得分:6)

简短的回答是肯定的。 Hive外部表可以指向多个文件/目录。长答案取决于数据的目录结构。执行此操作的典型方法是创建分区表,其中分区列映射到目录路径的某些部分。

E.g。我们有一个用例,其中外部表指向HDFS上的数千个目录。我们的路径符合此模式/prod/${customer-id}/${date}/。在每个目录中,我们有大约100个文件。在将其映射到Hive表时,我们创建了两个分区列,customer_id和date。因此,每天,我们都可以通过

将数据加载到Hive中
ALTER TABLE x ADD PARTITION (customer_id = "blah", dt = "blah_date") LOCATION '/prod/blah/blah_date';

答案 1 :(得分:0)

试试这个:

LOAD DATA LOCAL INPATH '/path/local/file_1' INTO TABLE tablename; 

LOAD DATA LOCAL INPATH '/path/local/file_2' INTO TABLE tablename;