MAPLOOKUP

从 VMAP 数据中返回单个键值。如果具有值,此标量函数返回 LONG VARCHAR;如果虚拟列没有值,则返回 NULL

对于虚拟列名,使用 maplookup 不区分大小写。为了避免加载同名值,请在数据加载时将 fjsonparser 解析器 reject_on_duplicate 参数设置为 true

通过 fjsonparserfavroparser 分析器及其 flatten-arrays 实参加载数据时,您可以控制 VMAP 中非标量值(例如数组)的行为。请参阅 JSON 数据FJSONPARSER 参考。

有关使用 maplookup() 访问嵌套 JSON 数据的信息,请参阅查询嵌套数据

语法

MAPLOOKUP (VMap-data, 'virtual-column-name' [USING PARAMETERS [case_sensitive={false | true}] [, buffer_size=n] ] )

参数

VMap-data

任何 Vmap 数据。Vmap 的存在形式可以是:

  • Flex 表的 __raw__

  • 从映射函数返回的数据(示例) MAPLOOKUP

  • 其他数据库内容

virtual-column-name
此函数返回值的虚拟列名称。
buffer_size
[可选参数] 指定每个返回 virtual-column-name 值的最大长度(以字节为单位)。为了返回所有 virtual-column-name 值,指定一个大于等于 (buffer_size) 任何返回值字节数的 =>。所有长度大于 buffer_size 的返回值将被拒绝。

默认值: 0buffer_size 无限制)

case_sensitive
[可选参数]

如果键在不同情况下存在,指定是否返回 virtual-column-name 的值。

示例:

(... USING PARAMETERS case_sensitive=true)

默认值: false

示例

此示例返回一个虚拟列 user.location 的值:

=> SELECT MAPLOOKUP(__raw__, 'user.location') FROM darkdata ORDER BY 1;
 maplookup
-----------
 Chile
 Nesnia
 Uptown
 .
 .
 chicago
(12 rows)

使用 maplookup buffer_size

使用 buffer_size= 参数表示映射查询为指定虚拟列返回的任何值的最大长度。如果返回键值均不大于 n 字节,则使用该参数分配 n 字节作为 buffer_size

对于下一个示例,将此 JSON 数据保存到文件 simple_name.json

{
  "name": "sierra",
  "age": "63",
  "eyes": "brown",
  "weapon": "doggie"
}
{
  "name": "janis",
  "age": "10",
  "eyes": "blue",
  "weapon": "humor"
}
{
  "name": "ben",
  "age": "43",
  "eyes": "blue",
  "weapon": "sword"
}
{
  "name": "jen",
  "age": "38",
  "eyes": "green",
  "weapon": "shopping"
}
  1. 创建 flex 表 logs

  2. 使用 simple_name.jsonlogs 数据载入 fjsonparser。指定 flatten_arrays 选项作为 True

    => COPY logs FROM '/home/dbadmin/data/simple_name.json'
      PARSER fjsonparser(flatten_arrays=True);
    
  3. maplookup 表的 buffer_size=0 键使用 logsname 。此查询返回所有值:

    => SELECT MAPLOOKUP(__raw__, 'name' USING PARAMETERS buffer_size=0) FROM logs;
     MapLookup
    -----------
     sierra
     ben
     janis
     jen
    (4 rows)
    
  4. 接下来,调用 maplookup() 3次,将 buffer_size 参数分别指定为 356。现在,maplookup() 返回字节长度小于或等于 (<=) buffer_size 的值:

    => SELECT MAPLOOKUP(__raw__, 'name' USING PARAMETERS buffer_size=3) FROM logs;
     MapLookup
    -----------
    
     ben
    
     jen
    (4 rows)
    => SELECT MAPLOOKUP(__raw__, 'name' USING PARAMETERS buffer_size=5) FROM logs;
     MapLookup
    -----------
    
     janis
     jen
     ben
    (4 rows)
    
    => SELECT MAPLOOKUP(__raw__, 'name' USING PARAMETERS buffer_size=6) FROM logs;
     MapLookup
    -----------
     sierra
     janis
     jen
     ben
    (4 rows)
    

消除空输出行的歧义

此示例展示如何解释空行。如果在没有首先检查密钥是否存在的情况下使用 maplookup,则可能产生歧义。查看下列输出(12 个空行)时,您无法确定 user.location 键是否具有:

  • 非 NULL 值

  • NULL

  • 无值

=> SELECT MAPLOOKUP(__raw__, 'user.location') FROM darkdata;
 maplookup
-----------












(12 rows)

消除空输出行,使用 mapcontainskey() 函数和 maplookup()。当 maplookup 返回空字段时,mapcontainskey 的相应值使用 t 表示 NULL 或其他值,或使用 f 表示无值。

以下使用全部两个函数的示例输出将具有 NULL 或名称值的行列为 t,将没有值的行列为 f

=> SELECT MAPLOOKUP(__raw__, 'user.location'), MAPCONTAINSKEY(__raw__, 'user.location')
FROM darkdata ORDER BY 1;
 maplookup | mapcontainskey
-----------+----------------
           | t
           | t
           | t
           | t
 Chile     | t
 Nesnia    | t
 Uptown    | t
 chicago   | t
           | f >>>>>>>>>>No value
           | f >>>>>>>>>>No value
           | f >>>>>>>>>>No value
           | f >>>>>>>>>>No value
(12 rows)

检查区分大小写的虚拟列

在键名称不同的情况下,您可以使用具有 maplookup() 参数的 case_sensitive 返回结果。

  1. 将下列实例内容保存为 JSON 文件。本例将文件保存为 repeated_key_name.json

    {
      "test": "lower1"
    }
    {
      "TEST": "upper1"
    }
    {
      "TEst": "half1"
    }
    {
      "test": "lower2",
      "TEst": "half2"
    }
    {
      "TEST": "upper2",
      "TEst": "half3"
    }
    {
      "test": "lower3",
      "TEST": "upper3"
    }
    {
      "TEst": "half4",
      "test": "lower4",
      "TEST": "upper4"
    }
    {
      "TesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttest
    TesttestTesttestTesttestTesttest":"1",
        "TesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttest
    TesttestTesttestTesttestTesttestTest12345":"2"
    }
    
  2. 创建 Flex 表 dupe,并加载 JSON 文件:

    => CREATE FLEX TABLE dupe();
    CREATE TABLE
    dbt=> COPY dupe FROM '/home/release/KData/repeated_key_name.json' parser fjsonparser();
     Rows Loaded
    -------------
               8
    (1 row)
    

另请参阅