无需Pandas,从Airflow上传Parquet文件至S3的实现问题
无需Pandas,用PyArrow + Airflow S3Hook上传Parquet到S3的解决方案
当然可以不用Pandas实现需求。你遇到的ValueError: Fileobj must implement read错误,是因为S3Hook.load_file_obj要求file_obj参数是实现了read方法的类文件对象,而你传入的是原始bytes类型,不符合要求。
修正后的代码如下:
import io import pyarrow as pa import pyarrow.parquet as pq from datetime import datetime # 假设pt是已有的pyarrow.Table对象 writer = pa.BufferOutputStream() pq.write_table(pt, writer) body = writer.getvalue() # 将字节数据包装为具备read方法的类文件对象 file_obj = io.BytesIO(body) s3_hook.load_file_obj( file_obj=file_obj, key='LoginAppWeb/login_app_web_{}.parquet'.format(datetime.now().strftime('%Y%m%d')), bucket_name=var_ambt["S3_OUTPUT_BUCKET"], replace=True )
关键说明
io.BytesIO会把pyarrow输出的字节数据包装成类文件对象,自动实现read方法,完美匹配load_file_obj的参数要求。- 整个流程完全不需要依赖Pandas,仅用PyArrow处理Parquet数据,结合Airflow S3Hook完成上传。
内容的提问来源于stack exchange,提问作者imatiasmb
相关产品推荐
相关产品推荐

