我需要在配置单元表中加载一个s3数据。这个s3位置是动态的,存储在另一个静态s3位置中。我想在配置单元表中加载的动态s3位置具有路径格式 s3://s3BucketName/some-path/yyyy-MM-dd 静态位置具有数据格式 {"datasetDate": "datePublished", "s3Location": "s3://s3BucketName/some-path/yyyy-MM-dd"} 有没有办法在Hive中读取这些数据?我找了很多,但什么也没找到。
s3://s3BucketName/some-path/yyyy-MM-dd
{"datasetDate": "datePublished", "s3Location": "s3://s3BucketName/some-path/yyyy-MM-dd"}
ztyzrc3y1#
您可以从静态位置文件parse中读取json数据 s3Location 字段并将其作为参数传递给add partition子句。读取json的可能方法是使用hive。你也可以用其他方法。使用配置单元的示例。
s3Location
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/';
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 partition语句。例如,您有一个名为 target_table 分区者 datePublished . 可以这样添加分区:
target_table
datePublished
# !/bin/bashdata_location=$(hive -e "set hive.cli.print.header=false; select get_json_object(location_info,'$.s3Location') from data_location")# get partition namepartition=$(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}'"
# !/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}'"
如果不需要分区表,则可以使用alter table set 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语句。在这种情况下,您不需要读取具有位置规范的文件的内容。只是时间安排 RECOVER PARTITIONS 每天安装新的隔板。
location s3://s3BucketName/some-path/
RECOVER PARTITIONS
1条答案
按热度按时间ztyzrc3y1#
您可以从静态位置文件parse中读取json数据
s3Location
字段并将其作为参数传递给add partition子句。读取json的可能方法是使用hive。你也可以用其他方法。
使用配置单元的示例。
然后获取shell脚本中的位置,并将其作为参数传递给add partition语句。
例如,您有一个名为
target_table
分区者datePublished
. 可以这样添加分区:如果不需要分区表,则可以使用alter table set location而不是添加分区:
如果只有最后一个子文件夹名是动态的(即日期),并且基本目录始终相同,如s3://s3bucketname/some path/,只有yyyy-mm-dd在更改,则可以使用
location s3://s3BucketName/some-path/
并发出recover partitions语句。在这种情况下,您不需要读取具有位置规范的文件的内容。只是时间安排RECOVER PARTITIONS
每天安装新的隔板。