我需要在蜂巢表中加载s3数据。该s3位置是动态的,并存储在另一个静态s3位置中。
我要在配置单元表中加载的动态s3位置具有路径格式
s3://s3BucketName/some-path/yyyy-MM-dd
并且静态位置具有数据格式
{"datasetDate": "datePublished", "s3Location": "s3://s3BucketName/some-path/yyyy-MM-dd"}
有没有办法在配置单元中读取此数据?我对此进行了很多搜索,但找不到任何东西。
答案 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
每天获取新分区即可。