将数据加载到存储在s3中的配置单元表中,该单元的位置存储在另一个静态s3位置中

时间:2019-10-01 07:15:05

标签: amazon-s3 hive

我需要在蜂巢表中加载s3数据。该s3位置是动态的,并存储在另一个静态s3位置中。

我要在配置单元表中加载的动态s3位置具有路径格式

s3://s3BucketName/some-path/yyyy-MM-dd

并且静态位置具有数据格式

{"datasetDate": "datePublished", "s3Location": "s3://s3BucketName/some-path/yyyy-MM-dd"}

有没有办法在配置单元中读取此数据?我对此进行了很多搜索,但找不到任何东西。

1 个答案:

答案 0 :(得分:1)

您可以从静态位置文件中读取JSON数据,解析s3Location字段,并将其作为参数传递给您的add partition子句。

读取json的可能方法是使用Hive。您可以使用其他一些方法。

使用Hive的示例。

create table data_location(location_info string)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY  '\t' LINES TERMINATED BY '\n' 
STORED AS TEXTFILE
    LOCATION 's3://s3BucketName/some-static-location-path/';

然后获取shell脚本中的位置,并将其作为参数传递给ADD分区语句。

例如,您有一个名为target_table的表,并被datePublished分区。您可以添加如下分区:

#!/bin/bash

data_location=$(hive -e "set hive.cli.print.header=false; select get_json_object(location_info,'$.s3Location') from data_location")

#get partition name
partition=$(basename ${data_location})

#Create partition in your target table:
hive -e "ALTER TABLE TARGET_TABLE ADD IF NOT EXISTS PARTITION (datePublished='${partition}') LOCATION '${data_location}'"

如果您不希望使用分区表,则可以使用 更改表集位置,而不添加分区:

hive -e "ALTER TABLE TARGET_TABLE SET LOCATION='${data_location}'"

如果只有最后一个子文件夹名称是动态的(即日期),并且基本目录始终相同,例如s3:// s3BucketName / some-path /,则仅yyyy-MM-dd会更改,您可以创建与location s3://s3BucketName/some-path/表一次并发出RECOVER PARTITIONS statement。在这种情况下,您不需要使用位置说明读取文件的内容。只需安排RECOVER PARTITIONS每天获取新分区即可。