如何在非Spark环境下读取Azure存储中的.json.gzip格式JSON文件?
解决Azure Blob存储gzip压缩JSON文件的读取问题
问题背景
从Azure Blob Storage下载后缀为.gzip的JSON压缩文件,使用两种Python方法读取失败,但Spark可正常读取,需非Spark环境的解决方案。
错误原因分析
- 尝试1:使用
gzip.decompress得到空结果,大概率是未正确处理解压后的多行JSON数据(Spark读取默认支持多行JSON),也可能是打印结果被截断导致的假象,可通过len(result)验证实际数据长度。 - 尝试2:错误使用
pd.read_csv读取JSON格式文件,文件类型不匹配,必然报错。
正确解决方案
方案1:gzip+JSON模块手动解析(适用于自定义解析逻辑)
from io import BytesIO import gzip import json import pandas as pd # 读取Blob完整内容到内存流 blob_data = BytesIO(myStorageStreamDownloaderObject.readall()) # 解压并逐行解析多行JSON with gzip.GzipFile(fileobj=blob_data, mode='rb') as decompressed_file: json_data = [json.loads(line.strip()) for line in decompressed_file if line.strip()] # 转换为DataFrame df = pd.DataFrame(json_data)
方案2:Pandas直接读取(最简方式)
利用Pandas原生支持压缩文件和多行JSON的特性:
from io import BytesIO import pandas as pd # 将Blob内容转为内存流 input_stream = BytesIO(myStorageStreamDownloaderObject.readall()) input_stream.seek(0) # 关键:使用read_json而非read_csv,指定gzip压缩和多行模式 df = pd.read_json(input_stream, compression='gzip', lines=True)
验证提示
- 你的
contents开头\x1f\x8b是标准gzip魔数,文件格式没问题。 - 若文件是单个JSON数组而非多行JSON,去掉
lines=True参数即可。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

