我创建一个表:
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集群。它总是从零开始—没有以前的数据—因此关注的只是添加数据,而不是删除数据。
1条答案
按热度按时间vd8tlhqk1#
您需要通过专门添加s3支持的分区来避免hive看到冰川支持的分区。在创建表之后,需要对365个日期中的每个日期执行此操作,如下所示: