雪花 - 获取另一个对象中一个对象的键值

时间:2021-04-28 18:22:55

标签: json object snowflake-cloud-data-platform

enter image description here我正在使用 Snowflake 并将 json 文件从 Staging 环境加载到 ODS 环境。

json 数据的结构如下:

{"address": "921 Pearl St",  
 "attributes": {
    "Alcohol": "'beer_and_wine'",
    "Ambience": "{'touristy': False, 'hipster': False, 'romantic': False, 'divey': False, 'intimate': False, 'trendy': False, 'upscale': False, 'classy': False, 'casual': True}",
    "BikeParking": "True",
    "BusinessAcceptsBitcoin": "False",
    "BusinessAcceptsCreditCards": "True",
    "BusinessParking": "{'garage': False, 'street': True, 'validated': False, 'lot': False, 'valet': False}"
}

现在我正在尝试像这样在 Snowflake 中查询我的数据:

SELECT json_data:attributes.BusinessParking.garage
FROM my_json_table; 

但我得到的只是空值。 知道如何到达“BusinessParking”字段的底层吗?

谢谢!!!

3 个答案:

答案 0 :(得分:0)

尝试在我得到的在线工具中解析 JSON:

Error: Parse error on line 9:
..., 'valet': False}"}
----------------------^
Expecting '}', ',', got 'EOF'

您可以通过运行 TRY_PARSE_JSON 来检查它是否正确:

SELECT TRY_PARSE_JSON(json_data) from my_json_table

答案 1 :(得分:0)

首先,您的对象缺少结束 }

因此,如果我将“JSON”重写为有效,则您使用的选择表单有效:

select parse_json('{
    "address": "921 Pearl St",  
    "attributes": {
        "Alcohol": "beer_and_wine",
        "Ambience": {
            "touristy": False, 
            "hipster": False, 
            "romantic": False, 
            "divey": False, 
            "intimate": False, 
            "trendy": False,
            "upscale": False, 
            "classy": False, 
            "casual": True
        },
        "BikeParking": True,
        "BusinessAcceptsBitcoin": "False",
        "BusinessAcceptsCreditCards": "True",
        "BusinessParking": {
            "garage": False, 
            "street": True, 
            "validated": False, 
            "lot": False, 
            "valet": False
        }
    }
 }') as json_data,
json_data:attributes.BusinessParking.garage,
json_data:attributes:BusinessParking:garage
;

但这意味着您的 JSON 无效。

看着你的 Ambience 它是一个字符串化的 JSON 子对象,而不是一个对象,因此它里面嵌入了 '。因此,在子字符串中转义您的 '`',为了正确解析,我们需要 PARSE_JSON 子对象,因此:

select parse_json('{"address": "921 Pearl St",  
 "attributes": {
    "Alcohol": "\'beer_and_wine\'",
    "Ambience": "{\'touristy\': False, \'hipster\': False, \'romantic\': False, \'divey\': False, \'intimate\': False, \'trendy\': False, \'upscale\': False, \'classy\': False, \'casual\': True}",
    "BikeParking": "True",
    "BusinessAcceptsBitcoin": "False",
    "BusinessAcceptsCreditCards": "True",
    "BusinessParking": "{\'garage\': False, \'street\': True, \'validated\': False, \'lot\': False, \'valet\': False}"
}}') as json_data,
PARSE_JSON(json_data:attributes.BusinessParking):garage

给出您正在寻找的答案 false

编辑

要添加更多详细信息,您的对象具有嵌套的 json 对象,它们是 Stringify'ed

复制上面(和下面)的 SQL 使用转义标记 \ 以允许单引号进入数据。但是之后我们可以选择 json_data:attributes.BusinessParking 并查看它的显示方式,就像您在示例中显示的那样,这意味着如果我们在其上使用 PARSE_JSON,我们将再次获得一个有效的 JSON 对象,然后我们可以通过 {{1} 访问它}}

:garage

给出:

enter image description here

答案 2 :(得分:0)

经过大量研究后,我能够以我需要的方式查询字段。 我发现我需要对这些字段使用“try_parse_json”函数,因为它们被定义为字符串而不是实际的 json 对象。

使用该函数后,我可以像这样解析特定字段:

SELECT
 TRY_PARSE_JSON(
  jsondata: attributes.BusinessParking
 ): garage AS garage
FROM
 "RESTAURANT"."STAGING"."JSON_TABLE_BUSINESS"

Snowflake 的文档不是很好,但它以某种方式解释了您可以做什么:https://docs.snowflake.com/en/sql-reference/functions/try_parse_json.html

这是另一种可以在需要时将字符串值转换为列的方法:https://sqlkover.com/cool-stuff-in-snowflake-part-3-split-and-flatten/

感谢@simeon-pilgrim 的所有评论!