Flex Extractor 标量函数可处理多结构数据。每个函数均接受以下输入数据:
-
现有数据库内容
-
表
-
从表达式返回
-
直接输入
这些函数不解析来自外部文件源的数据。所有函数均返回单一 VMap 值。Extractor 函数可以返回带 NULL 指定列的数据。
Flex Extractor 标量函数可处理多结构数据。每个函数均接受以下输入数据:
现有数据库内容
表
从表达式返回
直接输入
这些函数不解析来自外部文件源的数据。所有函数均返回单一 VMap 值。Extractor 函数可以返回带 NULL 指定列的数据。
用分隔符和其他可选实参提取数据,并返回单一的 VMap 值。
MAPDELIMITEDEXTRACTOR (record-value [ USING PARAMETERS param=value[,...] ])
delimiter
默认值: |
header_names
默认值:
ucoln
,其中 n 为列偏移数,第一列以 0
开头。
trim
默认值: true
treat_empty_val_as_null
NULL
而不是空字符串 (''
)。
默认值: true
这些示例使用了一个简短的分隔数据集:
Name|CITY|New city|State|zip
Tom|BOSTON|boston|MA|01
Eric|Burlington|BURLINGTON|MA|02
Jamie|cambridge|CAMBRIDGE|MA|08
首先,将此数据保存为 delim.dat
。
创建一个 Flex 表 dflex
:
=> CREATE FLEX TABLE dflex();
CREATE TABLE
使用 COPY 加载 delim.dat
文件。使用 Flex 表 fdelimitedparser
的 header='false'
选项:
=> COPY dflex FROM '/home/release/kmm/flextables/delim.dat' parser fdelimitedparser(header='false');
Rows Loaded
-------------
4
(1 row)
创建列式表 dtab
,它具有一个表示身份的 id
列、一个 delim
列和一个用于存储 VMap 的 vmap
列:
=> CREATE TABLE dtab (id IDENTITY(1,1), delim varchar(128), vmap long varbinary(512));
CREATE TABLE
使用 COPY 将 delim.dat
文件加载到 dtab
表中。MAPDELIMITEDEXTRACTOR 使用 header_names
参数以及 delimiter '!'
为示例数据指定标题行:
=> COPY dtab(delim, vmap AS MAPDELIMITEDEXTRACTOR (delim
USING PARAMETERS header_names='Name|CITY|New City|State|Zip')) FROM '/home/dbadmin/data/delim.dat'
DELIMITER '!';
Rows Loaded
-------------
4
(1 row)
将 MAPTOSTRING 用于 Flex 表 dflex
,以查看 __raw__
列内容。请注意使用中的默认标题名 (ucol0
– ucol4
),因为您在加载 Flex 表时指定 header='false'
:
=> SELECT MAPTOSTRING(__raw__) FROM dflex limit 10;
maptostring
-------------------------------------------------------------------------------------
{
"ucol0" : "Jamie",
"ucol1" : "cambridge",
"ucol2" : "CAMBRIDGE",
"ucol3" : "MA",
"ucol4" : "08"
}
{
"ucol0" : "Name",
"ucol1" : "CITY",
"ucol2" : "New city",
"ucol3" : "State",
"ucol4" : "zip"
}
{
"ucol0" : "Tom",
"ucol1" : "BOSTON",
"ucol2" : "boston",
"ucol3" : "MA",
"ucol4" : "01"
}
{
"ucol0" : "Eric",
"ucol1" : "Burlington",
"ucol2" : "BURLINGTON",
"ucol3" : "MA",
"ucol4" : "02"
}
(4 rows)
再次使用 MAPTOSTRING,这次将其用于 dtab
表的 vmap
列。将此输出的结果与 Flex 表的结果进行比较。请注意,MAPTOSTRING 返回了您在加载数据时指定的 header_name
参数值:
=> SELECT MAPTOSTRING(vmap) FROM dtab;
maptostring
------------------------------------------------------------------------------------------------------------------------
{
"CITY" : "CITY",
"Name" : "Name",
"New City" : "New city",
"State" : "State",
"Zip" : "zip"
}
{
"CITY" : "BOSTON",
"Name" : "Tom",
"New City" : "boston",
"State" : "MA",
"Zip" : "02121"
}
{
"CITY" : "Burlington",
"Name" : "Eric",
"New City" : "BURLINGTON",
"State" : "MA",
"Zip" : "02482"
}
{
"CITY" : "cambridge",
"Name" : "Jamie",
"New City" : "CAMBRIDGE",
"State" : "MA",
"Zip" : "02811"
}
(4 rows)
查询 delim
列,以不同的方式查看其内容:
=> SELECT delim FROM dtab;
delim
-------------------------------------
Name|CITY|New city|State|zip
Tom|BOSTON|boston|MA|02121
Eric|Burlington|BURLINGTON|MA|02482
Jamie|cambridge|CAMBRIDGE|MA|02811
(4 rows)
提取重复 JSON 数据对象(包括嵌套映射)或具有 JSON 元素外部列表的数据的内容。您可以设置一个或多个可选参数来控制提取过程。
MAPJSONEXTRACTOR (record-value [ USING PARAMETERS param=value[,...] ])
flatten_maps
.
) 分隔映射层级。
默认值: true
flatten_arrays
默认值: false
reject_on_duplicate
false
),或拒绝重复记录 (true
)。在任何一种情况下,加载都不受影响。
默认值: false
reject_on_empty_key
默认值: false
omit_empty_keys
默认值: false
start_point
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
,然后加载该文件。
创建一个 Flex 表 flexjson
:
=> CREATE FLEX TABLE flexjson();
CREATE TABLE
通过 fjsonparser
解析器,使用 COPY 加载 bake_single.json
文件:
=> COPY flexjson FROM '/home/dbadmin/data/bake_single.json' parser fjsonparser();
Rows Loaded
-------------
5
(1 row)
创建列式表 coljson
,它具有一个身份列 (id
)、一个 json
列和一个用于存储 VMap 的 vmap
列:
=> CREATE TABLE coljson(id IDENTITY(1,1), json varchar(128), vmap long varbinary(10000));
CREATE TABLE
利用 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)
将 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)
再次使用 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)
使用正则表达式提取数据,并以 VMap 的形式返回结果。
MAPREGEXEXTRACTOR (record-value [ USING PARAMETERS param=value[,...] ])
pattern
默认值: 空字符串 (''
)
use_jit
默认值: false
record_terminator
默认值: \n
logline_column
默认值: 空字符串 (''
)
这些示例使用以下正则表达式,它们搜索包括 timestamp
、date
、thread_name
和 thread_id
字符串的信息。
此示例表达式加载任何 thread_id
十六进制值,无论其是否包含 0x
前缀 (<thread_id>(?:0x)?[0-9a-f]+)
。
'^(?<time>\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d\.\d+)
(?<thread_name>[A-Za-z ]+):(?<thread_id>(?:0x)?[0-9a-f]+)
-?(?<transaction_id>[0-9a-f])?(?:[(?<component>\w+)]
\<(?<level>\w+)\> )?(?:<(?<elevel>\w+)> @[?(?<enode>\w+)]?: )
?(?<text>.*)'
为了方便显示,以下示例可能包含换行符。
创建一个 Flex 表 flogs
:
=> CREATE FLEX TABLE flogs();
CREATE TABLE
使用 Flex 表 fregexparser
时,利用 COPY 加载示例日志文件 (vertica.log
)。请注意,此示例包括为显示长文本行而添加的行字符。
=> COPY flogs FROM '/home/dbadmin/tempdat/vertica.log' PARSER FREGEXPARSER(pattern='
^(?<time>\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d\.\d+) (?<thread_name>[A-Za-z ]+):
(?<thread_id>(?:0x)?[0-9a-f])-?(?<transaction_id>[0-9a-f])?(?:[(?<component>\w+)]
\<(?<level>\w+)\> )?(?:<(?<elevel>\w+)> @[?(?<enode>\w+)]?: )?(?<text>.*)');
Rows Loaded
-------------
81399
(1 row)
用于返回通过正则表达式调用 MAPREGEXEXTRACTOR 的结果。输出以字符串格式返回函数的结果。
=> SELECT MAPTOSTRING(MapregexExtractor(E'2014-04-02 04:02:51.011
TM Moveout:0x2aab9000f860-a0000000002067 [Txn] <INFO>
Begin Txn: a0000000002067 \'Moveout: Tuple Mover\'' using PARAMETERS
pattern='^(?<time>\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d\.\d+)
(?<thread_name>[A-Za-z ]+):(?<thread_id>(?:0x)?[0-9a-f]+)
-?(?<transaction_id>[0-9a-f])?(?:[(?<component>\w+)]
\<(?<level>\w+)\> )?(?:<(?<elevel>\w+)> @[?(?<enode>\w+)]?: )
?(?<text>.*)'
)) FROM flogs where __identity__=13;
maptostring
--------------------------------------------------------------------------------------------------
{
"component" : "Txn",
"level" : "INFO",
"text" : "Begin Txn: a0000000002067 'Moveout: Tuple Mover'",
"thread_id" : "0x2aab9000f860",
"thread_name" : "TM Moveout",
"time" : "2014-04-02 04:02:51.011",
"transaction_id" : "a0000000002067"
}
(1 row)