加载存储在 s3 中的 hive 表中的数据,该表的位置存储在另一个静态 s3 位置



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

我想在 hive 表中加载的动态 s3 位置具有路径格式

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

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

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

有没有办法在 hive 中读取这些数据?我搜索了很多,但找不到任何东西。

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

读取 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 语句。在这种情况下,您无需读取带有位置规范的文件内容。只需安排RECOVER PARTITIONS即可每天附加新分区。

最新更新