如何将一个配置单元表指向多个外部文件?

mzsu5hc0  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(258)

我想能够附加多个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语法。

7xllpg7q

7xllpg7q1#

试试这个:

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

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

egmofgnx2#

简而言之,答案是肯定的。配置单元外部表可以指向多个文件/目录。长答案取决于数据的目录结构。执行此操作的典型方法是创建分区表,其中分区列Map到目录路径的某个部分。
e、 我们有一个用例,其中一个外部表指向hdfs上的数千个目录。我们的道路符合这种模式 /prod/${customer-id}/${date}/ . 在每个目录中,我们有大约100个文件。在将其Map到配置单元表时,我们创建了两个分区列,customer\ id和date。所以每天,我们都可以通过

ALTER TABLE x ADD PARTITION (customer_id = "blah", dt = "blah_date") LOCATION '/prod/blah/blah_date';

相关问题