我希望能够将多个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组件[编辑:这不起作用; 检查下面]:

代码talend为此生成使用tHiveLoad实际上LOAD DATA INPATH ...,这将删除文件在HDFS中的原始位置.
您必须在tHiveLoad中执行更早的ALTER TABLE语法.
简短的回答是肯定的.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)
| 归档时间: |
|
| 查看次数: |
9067 次 |
| 最近记录: |