如何解析雪花中的json?

时间:2020-08-17 21:15:34

标签: json snowflake-cloud-data-platform

我在雪花数据仓库中有以下json数据。由于费率具有多日的数据,而日期字段没有键并以值表示,因此如何将不同的日期展平为单独的行?

{
  "base": "USD",
  "end_at": "2020-08-17",
  "rates": {
    "2020-01-02": {
      "AUD": 1.4300008934,
      "BGN": 1.7473420888,
      "BRL": 4.0087554722,
      "CAD": 1.299830251,
      "CHF": 0.9706959707
    },
    "2020-01-03": {
      "AUD": 1.4381447923,
      "BGN": 1.7545527945,
      "BRL": 4.0612720911,
      "CAD": 1.2981968243,
      "CHF": 0.9724589576
    },
..
..
..,
  "start_at": "2020-01-01"
}

2 个答案:

答案 0 :(得分:1)

尝试在激活RECURSIVE的情况下使用展平。我尝试了以下方法来使用您的JSON结构进行验证,并能够获得有效的结果。

    //Store the JSON in VARIANT columns
    create temporary table JSON_SNIPPIT(
    JSON_RAW VARIANT
    )
    AS
    SELECT PARSE_JSON('
    {
      "base": "USD",
      "end_at": "2020-08-17",
      "rates": {
        "2020-01-02": {
          "AUD": 1.4300008934,
          "BGN": 1.7473420888,
          "BRL": 4.0087554722,
          "CAD": 1.299830251,
          "CHF": 0.9706959707
        },
        "2020-01-03": {
          "AUD": 1.4381447923,
          "BGN": 1.7545527945,
          "BRL": 4.0612720911,
          "CAD": 1.2981968243,
          "CHF": 0.9724589576
        },},
    "start_at": "2020-01-01"
    }');
    // This query to list all fields to check what to customise to your need
    Select * FROM JSON_SNIPPIT,LATERAL FLATTEN( INPUT => JSON_RAW:rates, RECURSIVE => TRUE);

//  Here I used this SQL to list all the currencies ordered by day, hope this what you want, enjoy!
        SELECT
          SUBSTRING(PATH,3,10) AS DAY_DATE,
          KEY AS CURRENCY,
          value::number(15,10) as DAY_RATES
          FROM JSON_SNIPPIT
          ,LATERAL FLATTEN( INPUT => JSON_RAW:rates, RECURSIVE => TRUE)
          WHERE KEY in ('AUD','BGN','BRL','CAD','CHF')
          ORDER BY 2,1;

结果:-

    DAY_DATE    CURRENCY    DAY_RATES
    2020-01-02  AUD         1.4300008934
    2020-01-03  AUD         1.4381447923
    2020-01-02  BGN         1.7473420888
    2020-01-03  BGN         1.7545527945
    2020-01-02  BRL         4.0087554722
    2020-01-03  BRL         4.0612720911
    2020-01-02  CAD         1.2998302510
    2020-01-03  CAD         1.2981968243
    2020-01-02  CHF         0.9706959707
    2020-01-03  CHF         0.9724589576

答案 1 :(得分:0)

如果您只想每天一排,那么我们是否应该假设您希望字典中保留所有货币值(变体)?如果是这样,那么也许就足够了:

WITH CTE_JSON AS (
  SELECT PARSE_JSON($1) AS MY_DICT
    FROM VALUES ($$
{
  "base": "USD",
  "end_at": "2020-08-17",
  "rates": {
    "2020-01-02": {
      "AUD": 1.4300008934,
      "BGN": 1.7473420888,
      "BRL": 4.0087554722,
      "CAD": 1.299830251,
      "CHF": 0.9706959707
    },
    "2020-01-03": {
      "AUD": 1.4381447923,
      "BGN": 1.7545527945,
      "BRL": 4.0612720911,
      "CAD": 1.2981968243,
      "CHF": 0.9724589576
    }
  },
  "start_at": "2020-01-01"
}
$$)
)
SELECT F.KEY::DATE AS MY_DATE
      ,F.VALUE AS CURRENCY_DICT
  FROM CTE_JSON C
      ,LATERAL FLATTEN(C.MY_DICT:"rates") F
 ORDER BY 1
;

如果要查找其他结果集,请准确指定所需的结果。

相关问题