如何通过Linux Shell与SnowSQL在JSON对象间添加逗号?
两种方案对比与操作指南
一、SQL SELECT阶段添加逗号(推荐小数据量场景)
优势
- 数据生成时直接处理,无需后续文件IO操作,流程闭环
- 逻辑清晰,减少脚本层面的额外维护
操作步骤
假设原SQL是生成单条JSON对象的语句:
SELECT JSON_OBJECT('id', id, 'name', username) AS json_output FROM user_table;
修改为通过窗口函数判断行号,仅给非最后一行的JSON末尾加逗号:
WITH ranked_records AS ( SELECT JSON_OBJECT('id', id, 'name', username) AS json_line, ROW_NUMBER() OVER (ORDER BY id) AS row_num, COUNT(*) OVER () AS total_rows FROM user_table ) SELECT CASE WHEN row_num < total_rows THEN json_line || ',' ELSE json_line END AS json_line FROM ranked_records;
导出时直接输出结果即可,若需生成合法JSON数组,可在SnowSQL脚本开头/结尾手动添加[和]。
二、生成文件后用KSH脚本添加逗号(推荐大数据量场景)
优势
- 不占用Snowflake计算资源,SQL逻辑无需修改
- 处理大文件时性能更优,避免窗口函数带来的计算开销
操作步骤
假设原始导出文件为raw_output.json,目标文件为final_output.json:
方法1:用sed+cat(适合小文件)
# 给除最后一行外的所有行末尾加逗号 sed '$!s/$/,/' raw_output.json > temp.json # 包裹为JSON数组(可选,若需合法数组格式) echo "[" > final_output.json cat temp.json >> final_output.json echo "]" >> final_output.json # 清理临时文件 rm temp.json
方法2:用awk(高效处理大文件)
# 遍历文件,给前n-1行加逗号,最后一行直接输出 awk 'NR>1{print prev ","} {prev=$0} END{print prev}' raw_output.json > temp.json # 包裹为JSON数组(可选) echo "[" > final_output.json cat temp.json >> final_output.json echo "]" >> final_output.json rm temp.json
方案选择建议
- 数据量≤10万行:优先选SQL阶段处理,流程更简洁
- 数据量>10万行:优先选文件后处理,降低Snowflake负载
内容的提问来源于stack exchange,提问作者Speedy
相关产品推荐
相关产品推荐

