ECL中如何处理批量JSON文件喷洒后缺失方括号的拼接逻辑文件?
问题:喷洒多JSON文件到HPCC Systems后缺失方括号,无法访问全部文件
我用DFUplus执行以下命令,将文件夹中多个JSON文件喷洒到HPCC Systems:
dfuplus action=spray server=http://localhost:8010/ srcip=10.0.2.15 prefix=FILENAME format=json srcfile=/var/lib/HPCCSystems/mydropzone/CSV/NEW2/*.json dstname=hthor::test dstcluster=mythor overwrite=1
ECL要求JSON为数组形式(示例):
[ { "name": "hauserGermany", "place": 56.08 }, { "name": "hyou", "place": 59.03535 } ]
但生成的逻辑文件缺失方括号,格式如下:
{ "name": "hauserGermany", "place": 56.08 }, { "name": "hyou", "place": 56.03535 }
注意:方括号已缺失
这导致我只能访问第一个文件,无法读取目录中所有文件。请问有什么解决方案?如何为逻辑文件添加方括号,或者是否存在其他可自动添加方括号的多喷洒方式?
解决方案
方案1:修改喷洒命令,使用行分隔JSON格式(推荐)
HPCC Systems的DFUplus原生支持行分隔JSON(JSON Lines),无需数组包裹。调整命令将format参数改为jsonline:
dfuplus action=spray server=http://localhost:8010/ srcip=10.0.2.15 prefix=FILENAME format=jsonline srcfile=/var/lib/HPCCSystems/mydropzone/CSV/NEW2/*.json dstname=hthor::test dstcluster=mythor overwrite=1
同时确保源文件中每个JSON对象单独占一行,若原文件不是这种格式,可批量用jq转换:
for file in /var/lib/HPCCSystems/mydropzone/CSV/NEW2/*.json; do jq -c . "$file" > temp.json && mv temp.json "$file" done
转换后文件示例:
{"name": "hauserGermany", "place": 56.08} {"name": "hyou", "place": 56.03535}
这种格式下ECL可直接读取所有对象,无需额外处理。
方案2:预处理源文件,批量添加方括号
若必须保留数组格式,可先给每个源JSON文件添加首尾方括号,再执行喷洒:
编写shell脚本批量处理:
for file in /var/lib/HPCCSystems/mydropzone/CSV/NEW2/*.json; do echo "[" > temp.json cat "$file" >> temp.json echo "]" >> temp.json mv temp.json "$file" done
处理完成后执行原喷洒命令即可,此时每个文件都是完整的JSON数组。
方案3:在ECL中修复缺失的方括号
如果已经完成喷洒,不想重新处理源文件,可在ECL中手动拼接方括号,将内容转为合法JSON数组:
// 读取逻辑文件原始内容 raw_content := DATASET('hthor::test', STRING, thor); // 拼接首尾方括号,生成合法JSON数组 full_json_array := '[' || JOIN(raw_content, ',') || ']'; // 解析JSON为结构化数据集 parsed_data := JSON.Parse(full_json_array, {STRING name, REAL place}); OUTPUT(parsed_data);
内容的提问来源于stack exchange,提问作者encoded150
相关产品推荐
相关产品推荐

