如何将本地.parquet文件正确上传至Azure Data Lake Storage Gen2
问题根因
两个方案的错误点非常明确:
- 第一个方案:读取parquet这类二进制文件时使用了文本模式
'r',Python会默认按系统文本编码解析字节流,直接破坏parquet的二进制结构,同时文本模式下读取内容的长度是字符数,和实际二进制字节长度不匹配,就算不报错上传的文件也会损坏无法读取。 - 第二个方案:
DataLakeFileClient类本身不存在upload_file方法,这个方法是普通Blob存储客户端的接口,在ADLS Gen2的文件客户端上直接调用必然抛出属性不存在的错误。
正确实现方案
首先确保你安装了官方最新版的ADLS Gen2 SDK:pip install --upgrade azure-storage-file-datalake
直接使用SDK封装好的upload_data方法上传即可,这个方法自动处理二进制读取、分块、偏移量计算、flush全流程,不需要手动拼接append和flush逻辑,稳定性更高,支持从几KB到几GB的文件上传。
from azure.storage.filedatalake import DataLakeServiceClient def upload_parquet_to_adls(): try: # 初始化服务客户端,替换为你自己的连接字符串/认证方式 service_client = DataLakeServiceClient.from_connection_string("你的ADLS Gen2账户连接字符串") # 获取目标容器(文件系统)客户端 file_system_client = service_client.get_file_system_client(file_system="my-file-system") # 获取目标目录客户端,目录不存在会自动创建 directory_client = file_system_client.get_directory_client("my-directory") directory_client.create_directory(exist_ok=True) # 获取目标文件客户端 file_client = directory_client.get_file_client("uploaded-file.parquet") # 关键:以二进制只读模式打开本地parquet文件 with open("C:\\file-to-upload.parquet", "rb") as local_file: # 上传数据,overwrite=True表示覆盖同名文件 file_client.upload_data(local_file, overwrite=True) print("parquet文件上传完成") except Exception as e: print(f"上传出错:{e}")
注意事项
- 打开本地文件必须使用
'rb'二进制模式,禁止使用文本模式读取parquet、压缩包、图片等任何非纯文本文件。 - 不需要手动调用
create_file方法,upload_data会自动在服务端创建不存在的文件。 - 如果需要批量上传,遍历本地所有parquet文件的路径,循环调用上传逻辑即可,注意为每个文件设置不重复的目标文件名,避免覆盖。
- 如果是超过10GB的超大parquet文件,只需要给
upload_data传入max_concurrency=4参数即可开启多线程并发上传,提升传输速度。
内容的提问来源于stack exchange,提问作者Javier Perez Tobia
相关产品推荐
相关产品推荐

