半结构化数据

Redshift 入门

Jason Myers

Principal Architect

半结构化数据

  • 存储在 Redshift 的 SUPER 类型中
  • 针对不同格式有专用 SQL 函数
  • JSON 是一种半结构化数据
Redshift 入门

JSON 验证函数

  • IS_VALID_JSON:确保整个 JSON 对象有效
SELECT IS_VALID_JSON('{"one":1, "two":2}');
IS_VALID_JSON
=============
true
SELECT IS_VALID_JSON('{"one":1, "two":2');
IS_VALID_JSON
=============
false
  • IS_VALID_JSON_ARRAY:确保 JSON 数组有效。
SELECT IS_VALID_JSON_ARRAY('{"one":1}')
IS_VALID_JSON_ARRAY
===================
false
SELECT IS_VALID_JSON_ARRAY('[1,2,3]')
IS_VALID_JSON_ARRAY
===================
true
Redshift 入门

从 JSON 对象提取

  • JSON_EXTRACT_PATH_TEXT 返回 JSON 路径处的值
  • 接收 JSON 字符串或字段,然后是一或多个路径键
SELECT JSON_EXTRACT_PATH_TEXT('{"one":1, "two":2}', 'one');
JSON_EXTRACT_PATH_TEXT
======================
1
Redshift 入门

尝试解析无效 JSON

-- 尝试从格式错误的 JSON 中提取路径
SELECT JSON_EXTRACT_PATH_TEXT('{"one":1, "two":2', 'one');
JSON parsing error
DETAIL:  
  =========================================
  error:  JSON parsing error
  code:      8001
  context:   invalid json object 
  query:     [child_sequence:'one']
  location:  funcs_json.hpp:202
  process:   padbmaster [pid=1073807529]
  =========================================
Redshift 入门

从嵌套 JSON 路径提取

  • 提供多个键参数
SELECT JSON_EXTRACT_PATH_TEXT('
         {
           "one_object":{
              "nested_three": 3, 
              "nested_four":4
           }, 
           "two":2
         }', 
         'one_object', 'nested_three');
JSON_EXTRACT_PATH_TEXT
======================
3
Redshift 入门

从不存在的嵌套 JSON 路径提取

  • 返回 NULL
    SELECT JSON_EXTRACT_PATH_TEXT('
           {
             "one_object":{
                "nested_three": 3, 
                "nested_four":4
             }, 
             "two":2
           }', 
           'two', 'nested_five');
    
JSON_EXTRACT_PATH_TEXT
======================
NULL
Redshift 入门

从 JSON 数组提取

  • JSON_EXTRACT_ARRAY_ELEMENT_TEXT 返回数组索引处的值
  • 接收 JSON 字符串或字段,然后是从 0 开始的整数索引。
SELECT JSON_EXTRACT_ARRAY_ELEMENT_TEXT('[1.1,400,13]', 2);
JSON_EXTRACT_ARRAY_ELEMENT_TEXT
===============================
13
SELECT JSON_EXTRACT_ARRAY_ELEMENT_TEXT('[1.1,400,13]', 3);
JSON_EXTRACT_ARRAY_ELEMENT_TEXT
===============================
NULL
Redshift 入门

从嵌套 JSON 数组提取

SELECT JSON_EXTRACT_ARRAY_ELEMENT_TEXT(
           JSON_EXTRACT_PATH_TEXT('
               {
                 "one":1, 
                 "nested_two":[3,4,5]
               }', 
               -- 用 JSON_EXTRACT_PATH_TEXT 提取 nested_two 的值
               'nested_two'
            ),
            -- 用 JSON_EXTRACT_ARRAY_ELEMENT_TEXT 提取数组位置 1 的元素
            1
       );
JSON_EXTRACT_ARRAY_ELEMENT_TEXT
===============================
4
Redshift 入门

从嵌套 JSON 数组提取的快捷方式

  • 数组索引需为字符串
-- 传入两个键('nested_two', '1')以选择
-- nested_two 键对应数组的第二个元素
SELECT JSON_EXTRACT_PATH_TEXT('
          {
            "one":1, 
            "nested_two":[3,4,5]
          }', 
          'nested_two', '1'
       );
JSON_EXTRACT_PATH_TEXT
======================
4
Redshift 入门

在 CTE 中进行类型转换

WITH location_details AS (
    SELECT '{
        "location": "Salmon Challis National Forest",
      }'::SUPER::VARCHAR AS data
) 
  • 可作为 location_details.data 访问
Redshift 入门

Passons à la pratique !

Redshift 入门

Preparing Video For Download...