首页 > 解决方案 > 无法使用横向展平等查询半结构化数据

问题描述

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

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

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

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

在此处输入图像描述

标签: snowflake-cloud-data-platformflattenvariant

解决方案


所描述的 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 首先将整个数组分成几行,然后应用路径样式提取从每个排。


推荐阅读