PermissionError:从 aws s3 读取文件时禁止

问题描述 投票:0回答:2

我正在使用 python 和 jupyter 笔记本,我正在尝试从 aws s3bucket 读取镶木地板文件,并将它们转换为单个 pandas 数据帧。

水桶和文件夹的排列方式如下:

The bucket name: mybucket
   First Folder: 123
      Second Folder: Parquets.parquet
        file1.snappy.parquet
        file2.snappy.parquet
        ....

我得到了完整的路径:

bucket = s3.Bucket(name='mybucket')
keys =[]
for key in bucket.objects.all():
  keys.append("s3://mybucket/"+key.key)

然后阅读它们:

count = 0
keys = keys[2:]
for obj in bucket.objects.all():
    subsrc = obj.Object()
    key = obj.key 
    path = keys[count]
    obj_df = pd.read_parquet(path)
    df_list.append(obj_df)
    count +=1
    

df = pd.concat(df_list)

但这给了我:

PermissionError: Forbidden 

指向行 'obj_df = pd.read_parquet(path)' 我知道我有完整的 s3 访问权限,所以这不应该是问题。非常感谢!

python pandas amazon-s3 jupyter-notebook parquet
2个回答
4
投票

这可能是因为数据的路径不正确。

(在上面的代码中,您正在执行

pd.read_parquet(path)
,其中
path = keys[count]
,但我很确定这只是 keys,其中不包括存储桶名称。)


0
投票

我在 AWS Glue 下使用笔记本和脚本时遇到了同样的问题。如果我对glue 4.0使用默认版本的boto3(1.24.70),我可以使用默认版本的pandas(1.5.1)并且

df = pd.read_parquet( s3_bucket_and_key )
按预期工作。

但是,(因为我需要更新的 boto3 API)当我将 "--additional-python-modules": "boto3>=1.34.81" 传递给我的工作时,

read_parquet
调用失败并出现禁止错误。我尝试添加“s3:*”对工作角色的访问权限,但仍然被禁止。

我还没有找到版本的神奇组合,但 boto3 1.25.5 在客户端创建时因参数不匹配而失败(抱歉,丢失了输出)。

这可能并不适合所有人,但因为我正在运行胶水作业,我可以利用glueContext为我加载镶木地板文件:

df = glueContext.create_dynamic_frame.from_options(
        connection_type="s3",
        format="parquet",
        connection_options={"paths": [ s3_bucket_and_key ]}
    ).toDF().toPandas()
© www.soinside.com 2019 - 2024. All rights reserved.