如何使用 Presto JSON 函数访问字段名称中带有“~”的 json 字段

Posted

技术标签:

【中文标题】如何使用 Presto JSON 函数访问字段名称中带有“~”的 json 字段【英文标题】:How to access a json field with "~" in the field name with Presto JSON functions 【发布时间】:2015-02-17 13:22:23 【问题描述】:

我的 json 字段中有一个“~”,例如“~id”。使用 Presto 0.75,我无法访问这些字段。以下是我迄今为止尝试过的没有成功的方法:

SELECT json_extract_scalar('"id":"1","table":"test"', '$.table'); // 这行得通

SELECT json_extract_scalar('"id":"1","~table":"test"', '$.[\"~table\"]'); // 无效

SELECT json_extract_scalar('"id":"1","~table":"test"', '$.[\~table]'); // 无效

给出的错误是“无效的 JSON 路径:”

【问题讨论】:

你试试'$[~table]'还是'$["~table"]' 【参考方案1】:

该 JSON 路径的正确格式是:'$["~table"]':

presto> SELECT json_extract_scalar('"id":"1","~table":"test"', '$["~table"]');

 _col0 
-------
 test  
(1 row)

这里有一些事实可以帮助您理解为什么您尝试过的替代方案不起作用:

JSON 路径表达式用 SQL 字符串表示。唯一需要转义的字符是字符串定界符(即单引号),您可以使用另一个单引号来进行转义。例如:'don''t'don't 的 SQL 字符串文字。 SQL 字符串文字中的双引号不需要转义。 JSON 路径表达式支持两种访问属性的形式:字段与数组元素访问。如果您有一个名为“foo”的属性,您可以使用'$["foo"]''$.foo' 访问它。字段访问语法仅适用于作为有效标识符(字母数字和下划线)的名称。

【讨论】:

同样的概念也适用于“-”连字符或破折号。我在 AWS Athena 中遇到了类似的问题,它依赖于 presto json 函数。 如果您想知道,像这样访问嵌套元素(如 "foo":"~bar":1)的数组元素看起来像这样:$["foo"]["~bar"]

以上是关于如何使用 Presto JSON 函数访问字段名称中带有“~”的 json 字段的主要内容,如果未能解决你的问题,请参考以下文章

拒绝访问 - EMR Presto - 基于文件的授权

如何使用 AWS Glue 从嵌套 json 字段/结构中的 DynamicFrame 访问数据

如何将 JSON 字段名称映射到不同的对象字段名称?

使用 Spark 访问嵌套在结构中的 json 数组

如何使用 Jackson 更改 JSON 中的字段名称

如何在 Presto 中交叉加入取消嵌套 JSON 数组