You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python将S3中CSV转为Parquet,代码无报错却转换失败如何解决?

问题原因

  • 核心原因:当前代码仅将转换后的Parquet数据写入了运行代码的本地磁盘,没有执行上传回S3的逻辑,因此在S3路径中看不到转换后的文件。
  • 额外注意:你使用的pq.write_to_dataset方法会生成一个存放多份分片Parquet文件的目录,而非单个Parquet文件,如果你的预期是生成单个Parquet文件,需要替换为pq.write_table方法。

调整方案

根据你的存储需求选择对应方案即可:

场景1:仅需将Parquet文件存储在本地

把代码最后一行替换为如下内容,运行后即可在代码执行的当前工作目录找到生成的单个Parquet文件:

pq.write_table(table, "test.parquet")

场景2:需要将转换后的Parquet文件上传回S3

可选择以下两种实现方式:

方式1:先生成本地临时文件再上传到S3
import pandas as pd
import boto3
import pyarrow as pa
import pyarrow.parquet as pq
import os

s3 = boto3.client("s3", region_name='us-east-2', aws_access_key_id='my key id',
                  aws_secret_access_key='my secret key')

# 读取S3上的CSV文件
obj = s3.get_object(Bucket='my bucket', Key='test.csv')
df = pd.read_csv(obj['Body'])
table = pa.Table.from_pandas(df)

# 生成本地临时Parquet文件
local_parquet_path = "test.parquet"
pq.write_table(table, local_parquet_path)

# 上传到S3指定路径,可自行修改目标Key
s3.upload_file(Filename=local_parquet_path, Bucket='my bucket', Key='test.parquet')

# 可选:删除本地临时文件释放空间
os.remove(local_parquet_path)
方式2:直接写入S3,无需生成本地临时文件(基于PyArrow的S3文件系统实现)
import pandas as pd
import boto3
import pyarrow as pa
import pyarrow.parquet as pq
from pyarrow import fs

# 初始化PyArrow的S3文件系统
s3_fs = fs.S3FileSystem(
    region='us-east-2',
    access_key='my key id',
    secret_key='my secret key'
)

# 读取S3上的CSV文件
s3 = boto3.client("s3", region_name='us-east-2', aws_access_key_id='my key id',
                  aws_secret_access_key='my secret key')
obj = s3.get_object(Bucket='my bucket', Key='test.csv')
df = pd.read_csv(obj['Body'])
table = pa.Table.from_pandas(df)

# 直接写入S3目标路径,格式为「桶名/目标Key」
s3_parquet_path = "my bucket/test.parquet"
with s3_fs.open_output_stream(s3_parquet_path) as out_stream:
    pq.write_table(table, out_stream)

内容的提问来源于stack exchange,提问作者Lino Costa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:15:03