MAPJSONEXTRACTOR

提取重复 JSON 数据对象(包括嵌套映射)或具有 JSON 元素外部列表的数据的内容。您可以设置一个或多个可选参数来控制提取过程。

语法

MAPJSONEXTRACTOR (record-value [ USING PARAMETERS param=value[,...] ])

参数

record-value
包含要对其应用表达式的 JSON 或包含分隔符格式记录的字符串。

参数

flatten_maps
布尔值,将 JSON 数据中的子映射平展,以句点 (.) 分隔映射层级。

默认值: true

flatten_arrays
布尔值,将列表转换为带有整数键的子映射。默认不对列表进行平展。

默认值: false

reject_on_duplicate
布尔值,忽略重复记录 (false),或拒绝重复记录 (true)。在任何一种情况下,加载都不受影响。

默认值: false

reject_on_empty_key
布尔值,拒绝任何包含不带值的键的行。

默认值: false

omit_empty_keys
布尔值,从加载数据中省略任何没有值的键。

默认值: false

start_point
JSON 加载数据中用作解析起点的键的名称。解析器忽略 start_point 值之前的所有数据。解析器会处理第一个实例后面的数据,最多到第二个,便会忽略任何保留的数据。

默认值:

示例

这些示例使用以下示例 JSON 数据:

{ "id": "5001", "type": "None" }
{ "id": "5002", "type": "Glazed" }
{ "id": "5005", "type": "Sugar" }
{ "id": "5007", "type": "Powdered Sugar" }
{ "id": "5004", "type": "Maple" }

将此示例数据保存为 bake_single.json,然后加载该文件。

  1. 创建一个 Flex 表 flexjson

    => CREATE FLEX TABLE flexjson();
    CREATE TABLE
    
  2. 通过 fjsonparser 解析器,使用 COPY 加载 bake_single.json 文件:

    => COPY flexjson FROM '/home/dbadmin/data/bake_single.json' parser fjsonparser();
     Rows Loaded
    -------------
               5
    (1 row)
    
  3. 创建列式表 coljson,它具有一个身份列 (id)、一个 json 列和一个用于存储 VMap 的 vmap 列:

    => CREATE TABLE coljson(id IDENTITY(1,1), json varchar(128), vmap long varbinary(10000));
    CREATE TABLE
    
  4. 利用 MAPJSONEXTRACTOR,使用 COPY 将 bake_single.json 文件加载到 coljson 表中:

    => COPY coljson (json, vmap AS MapJSONExtractor(json)) FROM '/home/dbadmin/data/bake_single.json';
     Rows Loaded
    -------------
               5
    (1 row)
    
  5. MAPTOSTRING 函数用于 Flex 表 flexjson 以将 __raw__ 列的内容输出为字符串:

    => SELECT MAPTOSTRING(__raw__) FROM flexjson limit 5;
                         maptostring
    -----------------------------------------------------
     {
       "id" : "5001",
       "type" : "None"
    }
    
     {
       "id" : "5002",
       "type" : "Glazed"
    }
    
     {
       "id" : "5005",
       "type" : "Sugar"
    }
    
     {
       "id" : "5007",
       "type" : "Powdered Sugar"
    }
    
     {
       "id" : "5004",
       "type" : "Maple"
    }
    
    (5 rows)
    
  6. 再次使用 MAPTOSTRING,这次将其用于 coljson 表的 vmap 列,并比较结果。元素顺序有所不同:

    => SELECT MAPTOSTRING(vmap) FROM coljson limit 5;
                         maptostring
    -----------------------------------------------------
     {
       "id" : "5001",
       "type" : "None"
    }
    
     {
       "id" : "5002",
       "type" : "Glazed"
    }
    
     {
       "id" : "5004",
       "type" : "Maple"
    }
    
     {
       "id" : "5005",
       "type" : "Sugar"
    }
    
     {
       "id" : "5007",
       "type" : "Powdered Sugar"
    }
    
    (5 rows)
    

另请参阅