如何通过Python脚本将Snowflake超60亿行查询结果导出至JSON文件?
面对60亿行的超大数据集,直接把所有数据塞进内存肯定会炸——这也是你之前脚本崩溃的核心原因。下面给你两个最可行的方案,从Python端优化和直接用Snowflake原生能力两个角度解决:
方案一:Python端分批读取+流式写入JSON
这个方案的核心是绝不把所有数据加载到内存,而是分批从Snowflake拉取数据,逐行写入JSON文件,同时保证JSON格式的正确性。
具体代码示例:
from sqlalchemy import create_engine from snowflake.sqlalchemy import URL import json links_output_file = 'links_file.json' friendships = '''select source as source, target as target, 1 as weight from database; ''' batch_size = 100000 # 根据你的内存情况调整批次大小,比如10万行一批 # 初始化数据库连接 engine = create_engine(URL( account='your_account', user='your_user', password='your_password', database='your_db', schema='your_schema', warehouse='your_warehouse', role='your_role' )) with engine.connect() as conn: # 启用流式查询,避免一次性加载所有结果到内存 result = conn.execution_options(stream_results=True).execute(friendships) with open(links_output_file, 'w') as f: # 先写入JSON数组的开头 f.write('[') first_entry = True while True: batch = result.fetchmany(batch_size) if not batch: break # 处理当前批次的每一行数据 for connection in batch: link_dict = {"source": connection[0], "target": connection[1], "weight": connection[2]} if not first_entry: # 非第一个元素前加逗号分隔 f.write(',') # 直接写入单个JSON对象,避免内存堆积 json.dump(link_dict, f) first_entry = False # 写入JSON数组的结尾 f.write(']')
这里的关键细节:
- 用
execution_options(stream_results=True)让SQLAlchemy开启流式查询,不会一次性把所有结果拉到本地内存 - 用
fetchmany分批获取数据,内存占用仅为单个批次的大小 - 直接用
json.dump逐行写入,代替先存列表再整体序列化的方式
方案二:直接用Snowflake原生导出(最优解)
对于这种超大规模的数据集,让Snowflake直接导出比通过Python中转高效得多,完全规避Python的内存瓶颈。你可以用Snowflake的COPY INTO命令,直接把查询结果导出成JSON文件到云存储(AWS S3、GCS、Azure Blob),之后再按需下载或处理。
示例SQL命令:
-- 先确保你已经创建了关联云存储的Snowflake Stage COPY INTO '@your_stage/path/to/links' FROM ( select source as source, target as target, 1 as weight from database ) FILE_FORMAT = (TYPE = JSON COMPRESSION = GZIP) MAX_FILE_SIZE = 5368709120; -- 设置每个文件最大5GB,避免单个文件过大
操作步骤:
- 先创建Snowflake Stage,关联你的云存储桶并配置好权限
- 执行上述
COPY INTO命令,Snowflake会自动把查询结果拆分成多个JSON文件(按指定大小)导出到目标路径 - 如果需要本地文件,可以通过Snowsql客户端运行
GET @your_stage/path/to/links命令下载到本地
这个方案的优势:
- 完全由Snowflake处理大数据导出,性能远超Python脚本
- 自动拆分大文件,方便后续处理
- 支持压缩,大幅节省存储空间和传输时间
补充:合并单文件JSON
如果你的下游算法需要单个JSON数组文件(Snowflake默认导出每行一个JSON对象),可以用jq工具快速合并:
jq -s '.' *.json > combined_links.json
内容的提问来源于stack exchange,提问作者urpi
相关产品推荐
相关产品推荐

