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

Mat*_*sen 4 hadoop hive hdfs

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

LOAD DATA INPATH移动HDFS文件蜂房仓库目录.

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

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

Pradeep答案的扩展解决方案:

例如,我的文件看起来像这样:

/root_directory/<job_id>/input/<dt>
Run Code Online (Sandbox Code Playgroud)

假装每个的架构是(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 ','
;
Run Code Online (Sandbox Code Playgroud)

假设我有两个要插入的文件位于:

/root_directory/b1/input/2014-01-01
/root_directory/b2/input/2014-01-02
Run Code Online (Sandbox Code Playgroud)

我可以将这两个外部文件加载到同一个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';
Run Code Online (Sandbox Code Playgroud)

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

Matthew Moisen Hive Talend Insert

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

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

Pra*_*ota 7

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

例如,我们有一个用例,其中外部表指向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';
Run Code Online (Sandbox Code Playgroud)

  • +1.为了进一步构建此答案,为动态添加到分区外部表的每个新分区指定的位置实际上可以是包含数据文件的文件夹的任意路径 - 它不必是最初定义的位置的子目录作为外部表的"根". (2认同)