【问题标题】:Can't query semi-structured data using lateral flatten etc无法使用横向展平等查询半结构化数据
【发布时间】:2020-05-30 04:13:40
【问题描述】:

我在一个表中有一些数据,其中一列是一个 Variant,其中包含一个 JSON 数据。我可以成功地展平数组和数组中的数组以访问其中的数据,但我正在努力展平键值对以访问给定键的值。

我在https://docs.snowflake.net/manuals/user-guide/json-basics-tutorial.html 看到了将其映射到我的用例的文档,结果中的值为 NULL。

我的变体部分显示在下面 - 特别是 MatchStatus 之类的值以及我有兴趣提取的变量下的键/值。

感谢您提供任何有用的建议。

【问题讨论】:

  • 请与我们分享原始json
  • 你可以用variant_col:PricingRequest.MatchStatus查询它
  • 谢谢 - Zephro 提供了快速而简单的答案。我想太多了。

标签: snowflake-cloud-data-platform flatten variant


【解决方案1】:

所描述的 JSON 具有简单的类路径结构,其中包含不同级别的对象(并且没有数组)。

根据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 首先将整个数组分成行,然后应用路径样式提取来检索每行的值。

【讨论】:

  • 感谢详细的回复,很有帮助。虽然可见的 JSON 只是对象,但其中一些对象包含数组,其中可能包含其他数组或对象,因此您会看到它如何迅速变得复杂,以及 FLATTEN 将在哪里提供帮助。
  • 您可能还会发现这很有用:stackoverflow.com/a/60242195/9056819
猜你喜欢
  • 2020-11-13
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 2019-12-10
  • 2023-01-10
  • 2020-03-09
  • 2020-12-06
相关资源
最近更新 更多