求助:使用AWS/AWSS3将Parquet文件上传至S3的可行示例
问题分析与解决方案
你的核心问题是:当前代码并没有上传本地Parquet文件的实际内容,而是把文件名的字符串写入了S3对象,导致生成的20B文件完全不是有效的Parquet格式(字符串"my_local_file.parquet"的字节长度刚好匹配这个大小,结尾的"quet"也对应报错信息)。
正确的上传方式
方法1:读取本地文件内容后写入S3Path
先读取本地Parquet文件的二进制内容,再写入S3路径,这是最直接的修正:
p = S3Path("s3://bucket/folder/my_local_file.parquet") # 读取本地Parquet文件的完整二进制数据 local_parquet_data = read("my_local_file.parquet") # 将二进制数据写入S3对象 write(p, local_parquet_data)
方法2:使用AWSS3.jl的专用上传函数
如果你使用的是AWSS3.jl包,可以直接调用upload或s3_put函数,更简洁且不易出错:
using AWSS3 # 方式一:直接指定本地文件和S3路径 upload("my_local_file.parquet", "s3://bucket/folder/my_local_file.parquet") # 方式二:分桶和路径参数传入 s3_put("bucket", "folder/my_local_file.parquet", read("my_local_file.parquet"))
额外注意事项
- 确保本地文件路径正确:如果脚本不在Parquet文件所在目录,要使用完整路径(比如
"/home/user/data/my_local_file.parquet") - 验证S3权限:确认你的AWS凭证拥有目标bucket的
PutObject权限 - 若直接生成Parquet到S3:如果是从DataFrame等数据结构生成Parquet,可直接通过IO流写入S3,避免本地文件中转:
using DataFrames, Parquet, AWSS3 df = DataFrame(a=1:10, b=rand(10)) io = IOBuffer() write_parquet(io, df) seekstart(io) upload(io, "s3://bucket/folder/generated.parquet")
内容的提问来源于stack exchange,提问作者awoj
相关产品推荐
相关产品推荐

