MAPLOOKUP
从 VMAP 数据中返回单个键值。如果具有值,此标量函数返回 LONG VARCHAR;如果虚拟列没有值,则返回 NULL。
对于虚拟列名,使用 maplookup 不区分大小写。为了避免加载同名值,请在数据加载时将 fjsonparser 解析器 reject_on_duplicate 参数设置为 true。
通过 fjsonparser 或 favroparser 分析器及其 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的返回值将被拒绝。默认值:
0(buffer_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"
}
-
创建 flex 表
logs。 -
使用
simple_name.json将logs数据载入fjsonparser。指定flatten_arrays选项作为True:=> COPY logs FROM '/home/dbadmin/data/simple_name.json' PARSER fjsonparser(flatten_arrays=True); -
对
maplookup表的buffer_size=0键使用logs的name。此查询返回所有值:=> SELECT MAPLOOKUP(__raw__, 'name' USING PARAMETERS buffer_size=0) FROM logs; MapLookup ----------- sierra ben janis jen (4 rows) -
接下来,调用
maplookup()3次,将buffer_size参数分别指定为3、5和6。现在,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 返回结果。
-
将下列实例内容保存为 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" } -
创建 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)