我正在使用 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 访问权限,所以这不应该是问题。非常感谢!
这可能是因为数据的路径不正确。
(在上面的代码中,您正在执行
pd.read_parquet(path)
,其中 path = keys[count]
,但我很确定这只是 keys,其中不包括存储桶名称。)
我在 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()