snowflake-cloud-data-platform - 无法使用横向展平等查询半结构化数据
问题描述
我在表中有一些数据,其中一列是一个 Variant,其中包含一个 JSON 数据。我可以成功地展平数组和数组中的数组以访问其中的数据,但我正在努力展平键值对以访问给定键的值。
我在https://docs.snowflake.net/manuals/user-guide/json-basics-tutorial.html上看到了文档,将其映射到我的用例中会导致结果中的值为 NULL。
我的变体部分显示在下面 - 特别是像 MatchStatus 和我有兴趣提取的变量下的键/值之类的值。
感谢您提供任何有用的建议。
解决方案
所描述的 JSON 具有简单的类似路径的结构,其中包含不同级别的对象(并且没有数组)。
Per Snowflake's semi-structured data documentation,使用点符号来提取遵循(平面嵌套)路径的值:
Insert a colon : between the VARIANT column name
and any first-level element: <column>:<level1_element>.
Use dot notation to traverse a path in a JSON object:
<column>:<level1_element>.<level2_element>.<level3_element>.
一个例子是(注意第三行和第四行中点的链接使用):
SELECT
badminton_odds:Id as id,
badminton_odds:PricingRequest.MatchStatus as match_status,
badminton_odds:PricingRequest.Variables.Dispersion as var_dispersion
FROM odds_table
您不需要FLATTEN来进行简单的奇异值提取。当您需要将一些系列数据分解为多行时(例如在数组的情况下),请使用 FLATTEN。
例如,如果问题中描述的 JSON 是单个数组元素在此类对象的长数组中的外观,您可以使用 FLATTEN 首先将整个数组分成几行,然后应用路径样式提取从每个排。
推荐阅读
- kubernetes - jq:如果存在某个值,则选择对象
- node.js - 我给了孩子 key 道具,但仍然显示:列表中的每个孩子都应该有一个唯一的“key”道具
- python - 如何使用 BeautifulSoup 提取网页内容的 url/链接
- java - 这是一个坏模式:确定接口实现的类
- c++ - C++ 使用 while / do while 循环解析字符串
- reactjs - 如何在 react + typescript 中设置道具类型
- javascript - JS:使用可选链的正确方法?
- java - 使应用程序配置可编辑 docker 映像/容器的最佳方法?
- java - Spring Boot @PreAuthorize hasAuthority 不起作用
- typescript - 如何使用通过 typescript compile api 生成装饰器