混合数组和字典的横向展平雪管数据
Lateral Flatten Snowpipe data with mixture of arrays and dict
我有两个不同的结构化 json 文件从 snowpipe 通过管道输入。唯一的区别是它有许多嵌套数组而不是嵌套字典。我想弄清楚如何将 结构 1 转换为一个最终确定的 table。我已成功将 结构 2 转换为 table 并包含以下代码。
我知道我需要使用横向展平但没有成功。
**Structure 1: Nested Arrays (Need help on)**
This json lives within a table and in column **JSONTEXT**
[
{
"ID": "xxx-xxxx-xxxx xxx-xxx",
"caseTypeID": "xx-xxxx-xxxx-xxxxx",
"content": {
"AccountID": "xx-xxxxx-xxxx-xxxx xxxx-xxxxx",
"AccountName": "XXXX",
"Address": {
"pxObjClass": "Data-Address-Postal"
},
"Addresses": [],
"AllKickoffsComplete": "true",
"BillingContactList": [],
"ClientCurrency": "USD",
"ClientID": "XXXXXX",
"ClientNSID": "XXXXXXXX-00",
"ClientName": "XXXXX XXXX Inc.",
"CompanyPhoneNumber": "XXX-XXX-XXXX",
"CrmSearchOrg": "XXXX",
"EEList": [
{
"AccountID": "xxx-xxxxx-xxxx-xxxxx xxxx-xxxxx",
"AccountName": "XXXX",
"AllowanceList": [
{
"AllowanceAmount": "327",
"AllowanceName": "Car Allowance",
"pxObjClass": "xxxxx-xxxxx-xxxxx"
]
结构二:嵌套字典
此 json 位于 table 和 JSONTEXT
列中
[
{
"OppID": "xxxx-xxxxx",
"pxObjClass": "xx-xxxxx-xxxx-xxxxxx",
"pxPages": {
"EEList": {
"Country": "xxx",
"CountryName": "xxx",
"Currency": "xxx",
"EstimatedICPCost": "xxxxxxxxxxx",
"ICPCurrency": "xxxxx",
"ICPID": "xxxxxxxxx.",
"ICPNSID": "xxxx-xx",
"ICPName": "xxx xx xx.",
"LocalMonthlySalary": "xxxxxx",
"MinFee": "xxxx",
"MonthlyGrossCost": "xxxxx",
"NewOrRepeatCustomer": "xxxxx",
"OppCloseDate": "xxx-xxx-xx",
"OppID": "xxx-xxxx",
"OpportunityName": "xxx - xxx xxx - xxx - xxxx",
"ReferralSource": "xxxxxx",
"pxObjClass": "Index-xx-xxxx-xxxx-xxxxxx",
"pxSubscript": "EEList"
}
},
"pyID": "xxxxxx",
"pzInsKey": "xxxx-xxxx-xxxx xxxxx-xxx"
},
]
这是我的第二个有效结构的代码。
create or replace table xxxx
as select
value:ID::varchar as ID,
value:caseTypeID::varchar as caseTypeID,
value:content:AccountID::varchar as AccountID,
value:content:AccountName::varchar as AccountName,
value:content:AllKickoffsComplete::boolean as AllKickoffsComplete,
value:content:ClientCurrency::varchar as ClientCurrency,
value:content:ClientID::varchar as ClientID,
value:content:ClientNSID::varchar as ClientNSID,
value:content:ClientName::varchar as ClientName,
value:content:CompanyAddressCountryName::varchar as CompanyAddressCountryName,
value:content:CompanyPhoneNumber::varchar as CompanyPhoneNumber,
value:content:CreateNew::boolean as CreateNew,
value:content:CrmSearchOrg::varchar as CrmSearchOrg,
value:content:EEList:AccountID::varchar as EE_AccountID,
value:content:EEList:AccountName::varchar as EE_AccountName
from new_raw_json,
lateral flatten (input =>jsontext);
这是我试过的代码,只有当你输入 jsontext[Nth].
时它才有效
select
value:ID::varchar as ID,
value:EEListID::varchar as EEListID,
value:caseTypeID::varchar as caseTypeID
from new_raw_json,
lateral flatten (input => jsontext[0]:content:EEList);
感谢任何帮助!
您可以chain multiple lateral views using FLATTEN继续分解为嵌套结构(数组中的数组)。
一个明确定义的方法可能会这样出现(这里只投影了一些列,以说明级别):
SELECT
outer_object.value:caseTypeID AS caseTypeID,
outer_object.value:content.AccountID AS parentAccountID,
eelist_object.value:AccountID AS eeListAccountID,
allowance_object.value:AllowanceName
FROM
new_raw_json,
LATERAL FLATTEN (input => jsontext) outer_object,
LATERAL FLATTEN (input => outer_object.value:content.EEList) eelist_object,
LATERAL FLATTEN (input => eelist_object.value:AllowanceList) allowance_object;
请注意,这只会分解一个已识别的多值路径 (List -> EEList -> AllowanceList
)。从问题中不清楚是否必须分解所有路径(例如 List -> EEList -> Addresses AND AllowanceList
),或者是否可以将其中一些路径存储为最终结果中的 VARIANT
(或其他复杂)类型。
例如,如果需要为 EEList
下 Addresses
中列出的每个地址复制 AllowanceList
值,这可以通过执行 JOIN
来自两个爆炸式查询结果(一个链接 List -> Addresses
,另一个链接 List -> EEList -> AllowanceList
)。
我有两个不同的结构化 json 文件从 snowpipe 通过管道输入。唯一的区别是它有许多嵌套数组而不是嵌套字典。我想弄清楚如何将 结构 1 转换为一个最终确定的 table。我已成功将 结构 2 转换为 table 并包含以下代码。
我知道我需要使用横向展平但没有成功。
**Structure 1: Nested Arrays (Need help on)**
This json lives within a table and in column **JSONTEXT**
[
{
"ID": "xxx-xxxx-xxxx xxx-xxx",
"caseTypeID": "xx-xxxx-xxxx-xxxxx",
"content": {
"AccountID": "xx-xxxxx-xxxx-xxxx xxxx-xxxxx",
"AccountName": "XXXX",
"Address": {
"pxObjClass": "Data-Address-Postal"
},
"Addresses": [],
"AllKickoffsComplete": "true",
"BillingContactList": [],
"ClientCurrency": "USD",
"ClientID": "XXXXXX",
"ClientNSID": "XXXXXXXX-00",
"ClientName": "XXXXX XXXX Inc.",
"CompanyPhoneNumber": "XXX-XXX-XXXX",
"CrmSearchOrg": "XXXX",
"EEList": [
{
"AccountID": "xxx-xxxxx-xxxx-xxxxx xxxx-xxxxx",
"AccountName": "XXXX",
"AllowanceList": [
{
"AllowanceAmount": "327",
"AllowanceName": "Car Allowance",
"pxObjClass": "xxxxx-xxxxx-xxxxx"
]
结构二:嵌套字典 此 json 位于 table 和 JSONTEXT
列中[
{
"OppID": "xxxx-xxxxx",
"pxObjClass": "xx-xxxxx-xxxx-xxxxxx",
"pxPages": {
"EEList": {
"Country": "xxx",
"CountryName": "xxx",
"Currency": "xxx",
"EstimatedICPCost": "xxxxxxxxxxx",
"ICPCurrency": "xxxxx",
"ICPID": "xxxxxxxxx.",
"ICPNSID": "xxxx-xx",
"ICPName": "xxx xx xx.",
"LocalMonthlySalary": "xxxxxx",
"MinFee": "xxxx",
"MonthlyGrossCost": "xxxxx",
"NewOrRepeatCustomer": "xxxxx",
"OppCloseDate": "xxx-xxx-xx",
"OppID": "xxx-xxxx",
"OpportunityName": "xxx - xxx xxx - xxx - xxxx",
"ReferralSource": "xxxxxx",
"pxObjClass": "Index-xx-xxxx-xxxx-xxxxxx",
"pxSubscript": "EEList"
}
},
"pyID": "xxxxxx",
"pzInsKey": "xxxx-xxxx-xxxx xxxxx-xxx"
},
]
这是我的第二个有效结构的代码。
create or replace table xxxx
as select
value:ID::varchar as ID,
value:caseTypeID::varchar as caseTypeID,
value:content:AccountID::varchar as AccountID,
value:content:AccountName::varchar as AccountName,
value:content:AllKickoffsComplete::boolean as AllKickoffsComplete,
value:content:ClientCurrency::varchar as ClientCurrency,
value:content:ClientID::varchar as ClientID,
value:content:ClientNSID::varchar as ClientNSID,
value:content:ClientName::varchar as ClientName,
value:content:CompanyAddressCountryName::varchar as CompanyAddressCountryName,
value:content:CompanyPhoneNumber::varchar as CompanyPhoneNumber,
value:content:CreateNew::boolean as CreateNew,
value:content:CrmSearchOrg::varchar as CrmSearchOrg,
value:content:EEList:AccountID::varchar as EE_AccountID,
value:content:EEList:AccountName::varchar as EE_AccountName
from new_raw_json,
lateral flatten (input =>jsontext);
这是我试过的代码,只有当你输入 jsontext[Nth].
时它才有效select
value:ID::varchar as ID,
value:EEListID::varchar as EEListID,
value:caseTypeID::varchar as caseTypeID
from new_raw_json,
lateral flatten (input => jsontext[0]:content:EEList);
感谢任何帮助!
您可以chain multiple lateral views using FLATTEN继续分解为嵌套结构(数组中的数组)。
一个明确定义的方法可能会这样出现(这里只投影了一些列,以说明级别):
SELECT
outer_object.value:caseTypeID AS caseTypeID,
outer_object.value:content.AccountID AS parentAccountID,
eelist_object.value:AccountID AS eeListAccountID,
allowance_object.value:AllowanceName
FROM
new_raw_json,
LATERAL FLATTEN (input => jsontext) outer_object,
LATERAL FLATTEN (input => outer_object.value:content.EEList) eelist_object,
LATERAL FLATTEN (input => eelist_object.value:AllowanceList) allowance_object;
请注意,这只会分解一个已识别的多值路径 (List -> EEList -> AllowanceList
)。从问题中不清楚是否必须分解所有路径(例如 List -> EEList -> Addresses AND AllowanceList
),或者是否可以将其中一些路径存储为最终结果中的 VARIANT
(或其他复杂)类型。
例如,如果需要为 EEList
下 Addresses
中列出的每个地址复制 AllowanceList
值,这可以通过执行 JOIN
来自两个爆炸式查询结果(一个链接 List -> Addresses
,另一个链接 List -> EEList -> AllowanceList
)。