Получение подполей из разобранного JSON в снежинке - PullRequest
0 голосов
/ 05 мая 2020

Мне трудно получить отдельные компоненты адресного компонента.

with data as (select PARSE_JSON('{ "data" : [ [ "row-ea6u~fkaa~32ry", "00000000-0000-0000-01B7-0B8F94EE5292", 0, 1486063689, null, 1486063689, null, "{ }", "410", "21206", "Frankford", "2", "NORTHEASTERN", [ "{\"address\": \"4509 BELAIR ROAD\", \"city\": \"Baltimore\", \"state\": \"MD\", \"zip\": \"\"}", null, null, null, true ], null, null, null ] }') as j ) select f.value[1][0]::text from data d, lateral flatten(input=> d.j:data,recursive=>TRUE) f;

f.value[1][0] имеет адрес поля

{"address": "4509 BELAIR ROAD", "city": "Baltimore", "state": "MD", "zip": ""}

но f.value[1][0].address возвращает null

Как мне получить отдельные атрибуты f.value [1], такие как адрес, город и т. Д. c?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Проблема заключается в том, что у вас есть три уровня вложенных данных, вы не должны использовать recursive=>TRUE, поскольку объекты не совпадают, поэтому вы не можете сделать что-либо ценное из данных. Вам нужно вручную разбить разные слои.

with data as (
  select 
  PARSE_JSON('{ data: [ [ "row-ea6u~fkaa~32ry", "0B8F94EE5292", 0, 1486063689, null, 1486063689, null, "{ }", "410", "21206", "Frankford", "2", "NORTHEASTERN", [ "{\\"address\\": \\"4509 BELAIR ROAD\\", \\"city\\": \\"Baltimore\\", \\"state\\": \\"MD\\", \\"zip\\": \\"\\"}", null, null, null, true ], null, null, null ]]}') as j
), data_rows as (
    select f.value as r
    from data d,
    lateral flatten(input=> d.j:data) f
)
select dr.r[0] as v0
    ,dr.r[1] as v1
    ,dr.r[2] as v2
    ,dr.r[3] as v3
    ,f.value as addr_n
from data_rows dr,
    lateral flatten(input=> dr.r[13]) f;

, чтобы получить все строки (из которых в вашем примере есть только одна), распаковать интересующие значения (вам нужно будет заполнить эту часть и дать v0 - значение vN), но есть массив или адреса

V0  V1  V2  V3  ADDR_N
"row-ea6u~fkaa~32ry"    "0B8F94EE5292"  0   1486063689  "{\"address\": \"4509 BELAIR ROAD\", \"city\": \"Baltimore\", \"state\": \"MD\", \"zip\": \"\"}"
"row-ea6u~fkaa~32ry"    "0B8F94EE5292"  0   1486063689  null
"row-ea6u~fkaa~32ry"    "0B8F94EE5292"  0   1486063689  null
"row-ea6u~fkaa~32ry"    "0B8F94EE5292"  0   1486063689  null
"row-ea6u~fkaa~32ry"    "0B8F94EE5292"  0   1486063689  true

теперь для декодирования адреса, как это делает json ,parse_json(f.value) as addr_n, поэтому вы можете разбить его на части, например:

with data as (
  select 
  PARSE_JSON('{ data: [ [ "row-ea6u~fkaa~32ry", "0B8F94EE5292", 0, 1486063689, null, 1486063689, null, "{ }", "410", "21206", "Frankford", "2", "NORTHEASTERN", [ "{\\"address\\": \\"4509 BELAIR ROAD\\", \\"city\\": \\"Baltimore\\", \\"state\\": \\"MD\\", \\"zip\\": \\"\\"}", null, null, null, true ], null, null, null ]]}') as j
), data_rows as (
    select f.value as r
    from data d,
    lateral flatten(input=> d.j:data) f
)
select dr.r[0] as v0
    ,dr.r[1] as v1
    ,dr.r[2] as v2
    ,dr.r[3] as v3
    ,parse_json(f.value) as addr_n
    ,addr_n:address::text as addr_address
    ,addr_n:city::text as addr_city
    ,addr_n:state::text as addr_state
    ,addr_n:zip::text as addr_zip  
from data_rows dr,
    lateral flatten(input=> dr.r[13]) f;

вы можете оставить фиктивную переменную addr_n в эфире или заменить ее, вырезав и вставив ее следующим образом:

    ,parse_json(f.value):address::text as addr_address
    ,parse_json(f.value):city::text as addr_city
    ,parse_json(f.value):state::text as addr_state
    ,parse_json(f.value):zip::text as addr_zip  
1 голос
/ 05 мая 2020

Вы можете шаг за шагом следовать этой статье: https://community.snowflake.com/s/article/Using-lateral-flatten-to-extract-data-from-JSON-internal-field

Надеюсь, это поможет!

...