使用Python azure-storage-file-datalake SDK无法在Azure Data Lake Gen2创建Append Blob
解决方案
你遇到的无法追加数据的问题和Blob类型没有直接关联,azure-storage-file-datalake SDK 本身支持对已创建的文件执行追加写操作,无需切换Blob类型。以下提供两种可行实现方案:
方案1:沿用azure-storage-file-datalake SDK实现追加写
你现有代码的问题是首次创建文件后,后续新消息到达时没有复用已有文件,而是重复创建新文件覆盖了原有内容。调整逻辑如下:
- 首次创建文件时保留现有逻辑,可添加
overwrite=False参数避免误覆盖已有文件 - 后续追加数据时直接获取已有文件的客户端,读取当前文件长度作为偏移量执行追加操作
参考实现代码:
# 调整后的全量写逻辑,兼容首次创建和后续追加 try: # 尝试创建新文件,文件已存在时抛出异常 file_client = day_directory_client.create_file(f'{json_name}', overwrite=False) current_offset = 0 except Exception: # 文件已存在,获取现有文件客户端并读取当前长度作为偏移量 file_client = day_directory_client.get_file_client(f'{json_name}') current_offset = file_client.get_file_properties().size append_content = f'{str(message_body)}\n' content_length = len(append_content) file_client.append_data(data=append_content, offset=current_offset, length=content_length) file_client.flush_data(current_offset + content_length) write_to_cache(year, month, day, json_path)
方案2:通过azure-storage-blob SDK创建追加Blob
如果你确实需要使用追加Blob类型,可通过路径拼接的方式定位ADLS Gen2容器内的文件:ADLS Gen2的目录层级在Blob SDK中会作为Blob名称的前缀存在,直接将完整路径拼接为Blob名称即可。
参考实现代码:
from azure.storage.blob import AppendBlobClient # 拼接ADLS内的完整路径作为Blob名称 blob_full_path = f'{year}/{month}/{day}/{json_name}' append_blob_client = AppendBlobClient.from_connection_string( conn_str="你的存储账户连接字符串", container_name="你的ADLS容器名称", blob_name=blob_full_path ) # 不存在则创建追加Blob,已存在则直接复用 append_blob_client.create_if_not_exists() # 追加数据,无需手动计算偏移量 append_blob_client.append_block(f'{str(message_body)}\n') write_to_cache(year, month, day, json_path)
内容的提问来源于stack exchange,提问作者Miguel Rincon
相关产品推荐
相关产品推荐

