我想能够附加多个hdfs文件到一个配置单元表,同时将hdfs文件留在其原始目录中。创建的这些文件位于不同的目录中。
这个 LOAD DATA INPATH
将hdfs文件移到配置单元仓库目录。
据我所知,一个外部表必须指向一个文件,或者指向一个目录,其中可以放置具有相同模式的多个文件。但是,我的文件不会在一个目录下。
是否可以将单个配置单元表指向单独目录中的多个外部文件,或者将多个文件复制到单个配置单元表中,而不将文件从其原始hdfs位置移动?
扩展了pradeep的答案:
例如,我的文件如下所示:
/root_directory/<job_id>/input/<dt>
假设每个的模式是(foo string、bar string、job\u 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
我可以将这两个外部文件加载到同一个配置单元表中,如下所示:
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组件[编辑:这不起作用;检查以下内容]:
talend使用thiveload为此生成的代码实际上是 LOAD DATA INPATH ...
,这将从hdfs中的原始位置删除文件。
您必须在thiveload中执行前面的alter table语法。
2条答案
按热度按时间7xllpg7q1#
试试这个:
egmofgnx2#
简而言之,答案是肯定的。配置单元外部表可以指向多个文件/目录。长答案取决于数据的目录结构。执行此操作的典型方法是创建分区表,其中分区列Map到目录路径的某个部分。
e、 我们有一个用例,其中一个外部表指向hdfs上的数千个目录。我们的道路符合这种模式
/prod/${customer-id}/${date}/
. 在每个目录中,我们有大约100个文件。在将其Map到配置单元表时,我们创建了两个分区列,customer\ id和date。所以每天,我们都可以通过