Все, что вам нужно сделать, это скопировать определения таблиц из одного региона в другой. Есть несколько способов сделать это
С Консолью AWS
Этот подход является наиболее простым и не требует дополнительной настройки, поскольку все основано на операторах Athena DDL .
- Получить определение таблицы с помощью
SHOW CREATE TABLE `database`.`table`;
Это должно вывести что-то вроде: CREATE EXTERNAL TABLE `database`.`table`(
`col_1` string,
`col_2` bigint,
...
`col_n` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
's3://some/location/on/s3'
TBLPROPERTIES (
'classification'='parquet',
...
'compressionType'='gzip')
- Изменить на нужный регион
- Создать
database
там, где вы хотитедля хранения определений таблиц или использования значений по умолчанию. - Оператор Execute, созданный
SHOW CREATE TABLE
. Обратите внимание, что вам может потребоваться изменить имя базы данных относительно предыдущего шага Если ваша таблица разбита на разделы, вам потребуется загрузить все разделы. Если данные на S3 придерживаются стиля разбиения HIVE, то есть
s3://some/location/on/s3
|
├── day=01
| ├── hour=00
| └── hour=01
...
, тогда вы можете использовать
MSCK REPAIR TABLE `database`.`table`
В качестве альтернативы, вы можете загружать разделы один за другим
ALTER TABLE `database`.`table`
ADD PARTITION (day='01', hour='00')
LOCATION 's3://some/location/on/s3/01/00';
ALTER TABLE `database`.`table`
ADD PARTITION (day='01', hour='01')
LOCATION 's3://some/location/on/s3/01/01';
...
С AWS API
Вы можете использовать AWS SDK, например, boto3
для python, который предоставляет простой в использовании объектно-ориентированный API. Здесь у вас есть два варианта:
Использовать клиент Athena. Как и в предыдущем подходе, вам потребуется получить определение таблицы из консоли AWS. Но все остальные шаги можно выполнить в сценарии с использованием метода start_query_execution
клиента Athena. В Интернете есть множество ресурсов, например, этот
Используйте клиент AWS Glue. Этот метод основан исключительно на работе с каталогом данных клея AWS, который используется Athena во время выполнения запроса. Основная идея состоит в том, чтобы создать два клиента склеивания, один для исходного и один для целевого каталога. Например,
import boto3
KEY_ID = "__KEY_ID__"
SECRET = "__SECRET__"
glue_source = boto3.client(
'glue',
region_name="ap-south-1",
aws_access_key_id=KEY_ID,
aws_secret_access_key=SECRET
)
glue_destination = boto3.client(
'glue',
region_name="us-east-1",
aws_access_key_id=KEY_ID,
aws_secret_access_key=SECRET
)
# Or you can do it with creating sessions
glue_source = boto3.session.Session(profile_name="profile_for_ap_south_1").client("glue")
glue_destination = boto3.session.Session(profile_name="profile_for_us_east_1").client("glue")
Тогда вам нужно будет использовать методы типа get и create. Это также потребует анализа ответов, которые будут получены от клиентов склеивания.
С помощью сканеров клея AWS
Хотя вы можете использовать сканеры клея AWS для "повторного обнаружения" данных на S3Я бы не рекомендовал этот подход, так как вы уже знаете структуру своих данных.