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)