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

如何将本地.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:27:34