используйте AWS_PROFILE в pandas.read_parquet

Я тестирую это локально, где у меня есть файл ~ / .aws / config.

~ / .aws / config выглядит примерно так:

      [profile a] 
...
[profile b]
...

У меня также есть переменная окружения AWS_PROFILE, установленная как «a».

Я хотел бы прочитать файл, доступный в профиле b с помощью pandas.

Я могу получить к нему доступ через s3fs при выполнении:

      import s3fs
fs = s3fs.S3FileSystem(profile="b")
fs.get("BUCKET/FILE.parquet", "FILE.parquet")
pd.read_parquet("FILE.parquet")

Однако, если я попытаюсь передать это в pd.read_parquet с помощью storage_options, я получу PermissionError: Forbidden.

      pd.read_parquet(
    "s3://BUCKET/FILE.parquet",
    storage_options={"profile": "b"},
)

полный Traceback ниже

      Traceback (most recent call last):
  File "/home/ray/local/bin/anaconda3/envs/main/lib/python3.8/site-packages/s3fs/core.py", line 233, in _call_s3
    out = await method(**additional_kwargs)
  File "/home/ray/local/bin/anaconda3/envs/main/lib/python3.8/site-packages/aiobotocore/client.py", line 154, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/ray/local/bin/anaconda3/envs/main/lib/python3.8/site-packages/pandas/io/parquet.py", line 459, in read_parquet
    return impl.read(
  File "/home/ray/local/bin/anaconda3/envs/main/lib/python3.8/site-packages/pandas/io/parquet.py", line 221, in read
    return self.api.parquet.read_table(
  File "/home/ray/local/bin/anaconda3/envs/main/lib/python3.8/site-packages/pyarrow/parquet.py", line 1672, in read_table
    dataset = _ParquetDatasetV2(
  File "/home/ray/local/bin/anaconda3/envs/main/lib/python3.8/site-packages/pyarrow/parquet.py", line 1504, in __init__
    if filesystem.get_file_info(path_or_paths).is_file:
  File "pyarrow/_fs.pyx", line 438, in pyarrow._fs.FileSystem.get_file_info
  File "pyarrow/error.pxi", line 122, in pyarrow.lib.pyarrow_internal_check_status
  File "pyarrow/_fs.pyx", line 1004, in pyarrow._fs._cb_get_file_info
  File "/home/ray/local/bin/anaconda3/envs/main/lib/python3.8/site-packages/pyarrow/fs.py", line 226, in get_file_info
    info = self.fs.info(path)
  File "/home/ray/local/bin/anaconda3/envs/main/lib/python3.8/site-packages/fsspec/asyn.py", line 72, in wrapper
    return sync(self.loop, func, *args, **kwargs)
  File "/home/ray/local/bin/anaconda3/envs/main/lib/python3.8/site-packages/fsspec/asyn.py", line 53, in sync
    raise result[0]
  File "/home/ray/local/bin/anaconda3/envs/main/lib/python3.8/site-packages/fsspec/asyn.py", line 20, in _runner
    result[0] = await coro
  File "/home/ray/local/bin/anaconda3/envs/main/lib/python3.8/site-packages/s3fs/core.py", line 911, in _info
    out = await self._call_s3(
  File "/home/ray/local/bin/anaconda3/envs/main/lib/python3.8/site-packages/s3fs/core.py", line 252, in _call_s3
    raise translate_boto_error(err)
PermissionError: Forbidden

Примечание: есть старый вопрос, отчасти связанный с этим, но он не помог: как читать файл паркета из s3 с помощью dask с определенным профилем AWS

1 ответ

Вам просто нужно добавить следующий аргумент в функцию:

      storage_options=dict(profile='your_profile_name')

Следовательно, оператор чтения:

      pd.read_parquet("s3://your_bucket",storage_options=dict(profile='your_profile_name'))
Другие вопросы по тегам