使用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
相关产品推荐
相关产品推荐

