怎样用 esProc 变换 json 串里的多层集合
有一个 2 层的 json 串,下层是多个动态的 key-value,不含集合 / 数组类型。
{"Games": {"key1": "value1", "key2": value2,"key3":value3}}
现在要把下层变换成多层的集合。
{"Games":{"AllGames":[{"key1":["value1"]},{"key2":["value2"]},{"key3":["value3"]}]}}
SQL 本身不支持多层数据,更难表达多层集合,间接实现的代码很复杂。SPL 天然支持多层数据和多层集合:https://try.esproc.com/splx?4JF
A |
|
1 |
{"Games": {"key1": "value1", "key2": value2,"key3":value3}} |
2 |
=E@p([A1.Games]) |
3 |
=new(new(A2.(eval("new([~2]:"/ ~1 /")")):AllGames):Games) |
4 |
=json(A3) |
A1:将多层 json 串自动解析为 SPL 序表类型。点击展开后,可以看到上层是单字段的一条记录,下层是多字段的一条记录。
A2:取下层数据(一条记录),将类型改为记录的集合,再转置为二层序列。[…] 表示集合,函数 E 可以将记录集合转换为二维序列,@p 表示转换时进行转置。
A3 部分代码:A2.(eval(“new([~2]:”/ ~1 /“)”)) 把 A2 中的序列变成多层集合。函数 eval 可以把字符串当做代码执行,函数 new(字段值: 字段名) 可以生成一条记录,~ 表示序列的当前成员,~1 表示第 1 个子成员。计算结果如下图:
new(new(…:AllGames):Games) 在多层集合上面加两层记录类型,构造出目标序表。
A4:最后用 json 函数将序表转换为目标 json 串。
来源:https://stackoverflow.com/questions/78035481/transform-json-in-aws-athena
英文版 https://c.esproc.com/article/1745972964384