[英]parsing json key-value in snowflake with key having a dots in it
{
"deviceLocale": "en_US",
"deviceSerialNumber": "xxxxxxxxxx",
"eventSource": "abc",
"ext.user.browser": "Mobile Safari",
"ext.user.browser.version": "1.0.4",
"ext.user.device.family": "iPhone",
"ext.user.os": "iOS",
"ext.user.os.version": "1.3.0",
"Timestamp": 158007896874 }
這是我擁有的示例 json。
在雪花中解析
```
select distinct
eve_id,
json_payload:ext.useragent.device.family::varchar as type,
json_payload:ext.useragent.os::varchar as osname,
json_payload:ext.useragent.os.version::varchar as os
from XYZ table, lateral flatten (input => json_payload)
```
但是這三個字段都給出了 NULL 值,我看到了 json 格式的數據。 所以我猜解析是不對的。 我在解析雪花時知道我們是否使用點或 : 那么它指的是嵌套鍵。 但就我而言,我有一個沒有嵌套鍵的簡單 json。
任何的想法?
首先,您可以將名稱放在雙引號中,如下所示:
SELECT parse_json('{
"deviceLocale": "en_US",
"deviceSerialNumber": "xxxxxxxxxx",
"eventSource": "abc",
"ext.user.browser": "Mobile Safari",
"ext.user.browser.version": "1.0.4",
"ext.user.device.family": "iPhone",
"ext.user.os": "iOS",
"ext.user.os.version": "1.3.0",
"Timestamp": 158007896874 }') AS json_payload,
json_payload:"ext.user.device.family"::varchar as type,
json_payload:"ext.user.os"::varchar as osname,
json_payload:"ext.user.os.version"::varchar as os;
給出:
JSON_PAYLOAD TYPE OSNAME OS
{ "Timestamp": 158007896874, "deviceLocale": "en_US", "deviceSerialNumber": "xxxxxxxxxx", "eventSource": "abc", "ext.user.browser": "Mobile Safari", "ext.user.browser.version": "1.0.4", "ext.user.device.family": "iPhone", "ext.user.os": "iOS", "ext.user.os.version": "1.3.0" } iPhone iOS 1.3.0
或者您可以使用['']
格式,如json_payload['ext.user.os.version']::varchar as os
允許避免雙引號(如果您想避免這種情況)。
在您訪問 SQL 時,您有json_payload:ext.useragent.device.family::varchar
但useragent
部分只是您 JSON 中的user
。 所以會給你帶來麻煩。
同樣在您的示例中,您使用的是 LATERAL FLATTEN,但詢問如何訪問您正在展平的對象的展平成員。 所以不需要扁平化。 但是,如果您想要扁平化,那么您將在每個頂級項目中獲得一行,此時您可能想要過濾key
.. 但我懷疑這不是您想要做的。 但是,如果您是一個好主意,則將展平別名化以幫助顯示意圖。
WITH jp AS (
SELECT parse_json('{
"deviceLocale": "en_US",
"deviceSerialNumber": "xxxxxxxxxx",
"eventSource": "abc",
"ext.user.browser": "Mobile Safari",
"ext.user.browser.version": "1.0.4",
"ext.user.device.family": "iPhone",
"ext.user.os": "iOS",
"ext.user.os.version": "1.3.0",
"Timestamp": 158007896874 }') AS json_payload
)
SELECT
f.key,
f.path,
f.value
FROM jp, LATERAL FLATTEN (input => json_payload) f;
給出:
KEY PATH VALUE
Timestamp Timestamp 158007896874
deviceLocale deviceLocale "en_US"
deviceSerialNumber deviceSerialNumber "xxxxxxxxxx"
eventSource eventSource "abc"
ext.user.browser ['ext.user.browser'] "Mobile Safari"
ext.user.browser.version ['ext.user.browser.version'] "1.0.4"
ext.user.device.family ['ext.user.device.family'] "iPhone"
ext.user.os ['ext.user.os'] "iOS"
ext.user.os.version ['ext.user.os.version'] "1.3.0"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.