Разбор JSON без имен ключей для получения столбца - PullRequest
1 голос
/ 05 мая 2020

Я загружаю json с data.gov, у которого нет ключевых имен для значений в данных json, например, ниже: метаданные доступны отдельно.

Я могу загрузить json в вариантный столбец, но не вижу, как анализировать и запрашивать указанные c столбцы, например, Франкфорд ниже - я пробовал JSONcol: data [0], который возвращает вся запись, но я не могу понять, как указать, скажем, столбец 4.

  {
    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 ]]
    }

Для создания и загрузки таблицы снежинок используется следующий код:

create or replace table snowpipe.public.snowtable(jsontext variant);

copy into snowpipe.public.snowtable
    from @snowpipe.public.snowstage
    file_format = (type = 'JSON')

1 Ответ

2 голосов
/ 05 мая 2020

Не совсем уверен, как выглядят ваши данные о вариантах после их загрузки, но экспериментируем с вариантом с помощью PARSE_ JSON для вашего объекта. Что мне нужно удвоить sla sh \, чтобы сделать его действительным sql.

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
    ,j:data as jd
    ,jd[0] as jd0
    ,jd0[3] as jd0_3
    ,array_slice(j:data[0],3,5) as jd0_3to4
;

показывает, что вы можете использовать нотацию [0] для индексных массивов и, таким образом, получить результаты:

J: { "data": [ [ "row-ea6u~fkaa~32ry", "0B8F94EE5292", 0, 1486063689, null, 1486063689, null, "{ }", "410", "21206", "Frankford", "2", "NORTHEASTERN", [ "{\"a...

JD: [ [ "row-ea6u~fkaa~32ry", "0B8F94EE5292", 0, 1486063689, null, 1486063689, null, "{ }", "410", "21206", "Frankford", "2", "NORTHEASTERN", [ "{\"address\": \"4509 BELAIR ROAD\", \"city\": \"...

JD0: [ "row-ea6u~fkaa~32ry", "0B8F94EE5292", 0, 1486063689, null, 1486063689, null, "{ }", "410", "21206", "Frankford", "2", "NORTHEASTERN", [ "{\"address\": \"4509 BELAIR ROAD\", \"city\": \"Baltimore\", \"state\": \"MD\", \"...

JD0_3: 1486063689

JD0_3TO4: [ 1486063689, null ]

, поэтому, если у вас есть неизвестное количество элементов первого уровня в данных, к которым вы хотите получить доступ, используйте LATERAL FLATTEN вот так:

WITH data as (
    select PARSE_JSON('{ data: [ [ "row-1", "0B8", 0 ],["row-2", "F94", 2], 
["row-3", "EE5", 4]]}') as j
)
select f.value[0]::text as row_name
    ,f.value[1]::text as serial_number
    ,f.value[2]::number as num
from data d,
lateral flatten(input=> d.j:data) f;

дает:

 ROW_NAME   SERIAL_NUMBER   NUM
 row-1      0B8             0
 row-2      F94             2
 row-3      EE5             4
...