如何只将365个更新的文件加载到hadoop/hive中?

ulydmbyx  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(223)

我创建一个表:

CREATE EXTERNAL TABLE events (
  id bigint, received_at string, generated_at string, source_id int, source_name string, source_ip string, facility string, severity string, program string, message string
)
PARTITIONED BY (
  dt string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION 's3://mybucket/folder1/folder2';

在s3://mybucket/folder1/folder2中有多个命名格式的文件夹 dt=YYYY-MM-DD/ 在每个文件夹中,一个文件,以命名格式 YYYY-MM-DD.tsv.gz 然后我通过 MSCK REPAIR TABLE events; . 当我做一个 SELECT * FROM events LIMIT 5; ,我明白了

OK
Failed with exception java.io.IOException:com.amazonaws.services.s3.model.AmazonS3Exception: The operation is not valid for the object's storage class (Service: Amazon S3; Status Code: 403; Error Code: InvalidObjectState; Request ID: 66C6392F74DBED77), S3 Extended Request ID: YPL1P4BO...+fxF+Me//cp7Fxpiuqxds2ven9/4DEc211JI2Q7BLkc=
Time taken: 0.823 seconds

因为超过365天的物体被移到了冰川。
如何以编程方式仅将365个较新的文件加载到数据库中,或者更好地说,我可以指定仅加载比设定日期更新/命名超过设定日期的文件?
ps:我只会在需要的时候启动hadoop/hive集群。它总是从零开始—没有以前的数据—因此关注的只是添加数据,而不是删除数据。

vd8tlhqk

vd8tlhqk1#

您需要通过专门添加s3支持的分区来避免hive看到冰川支持的分区。在创建表之后,需要对365个日期中的每个日期执行此操作,如下所示:

CREATE EXTERNAL TABLE ...;
ALTER TABLE events ADD PARTITION (dt = '2015-01-01');
ALTER TABLE events ADD PARTITION (dt = '2015-01-02');
ALTER TABLE events ADD PARTITION (dt = '2015-01-03');
...
ALTER TABLE events ADD PARTITION (dt = '2015-12-31');
SELECT * FROM events LIMIT 5;

相关问题