正则表达式中的匹配项
您可以使用 fregexparser
将正则表达式的匹配结果加载到 Flex 表或列式表中。本节将介绍 Flex 解析器支持选项的一些使用示例。
示例正则表达式
这些示例将使用以下正则表达式,它们会搜索包括 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 表
您可以使用 fregexparser
将正则表达式结果加载到 Flex 表中。。有关执行此操作的完整示例,请参阅 FREGEXPARSER。
针对列式表使用 fregexparser
此部分说明了如何加载针对 Vertica 数据库示例日志文件使用的正则表达式的结果。通过使用外部表定义,介绍了使用 fregexparser 将数据加载到列式表中的示例。将 Flex 表解析器用于列式表使您能够在一个表中混合数据加载。例如,您可以在一个会话中加载正则表达式的结果,在另一个会话中加载 JSON 数据。
以下基本示例说明了这种用法。
-
创建一个列式表
vlog
,带有以下列:=> CREATE TABLE vlog ( "text" varchar(2322), thread_id varchar(28), thread_name varchar(44), "time" varchar(46), component varchar(30), level varchar(20), transaction_id varchar(32), elevel varchar(20), enode varchar(34) );
-
借助
fregexparser
使用 COPY 加载采用上述示例正则表达式的日志文件的多个部分:在您自己尝试之前,请务必从该表达式示例中移除任何行字符:=> COPY v_log FROM '/home/dbadmin/data/flex/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>.*)'
-
查询
time
列:=> SELECT time FROM flogs limit 10; time ------------------------- 2014-04-02 04:02:02.613 2014-04-02 04:02:02.613 2014-04-02 04:02:02.614 2014-04-02 04:02:51.008 2014-04-02 04:02:51.010 2014-04-02 04:02:51.012 2014-04-02 04:02:51.012 2014-04-02 04:02:51.013 2014-04-02 04:02:51.014 2014-04-02 04:02:51.017 (10 rows)
借助 fregexparser 使用外部表
通过为 Vertica 日志文件创建外部列式表,查询该表将返回更新后的日志信息。以下基本示例说明了这种用法。
-
创建列式表
vertica_log
,使用AS COPY
子句和fregexparser
加载正则表达式的匹配结果。为了便于说明,此正则表达式具有用于拆分长文本行的换行符。在使用此表达式进行测试之前,请移除所有换行符:=> CREATE EXTERNAL TABLE public.vertica_log ( "text" varchar(2322), thread_id varchar(28), thread_name varchar(44), "time" varchar(46), component varchar(30), level varchar(20), transaction_id varchar(32), elevel varchar(20), enode varchar(34) ) AS COPY FROM '/home/dbadmin/data/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>.*)'
-
从外部表查询以获取更新后的结果:
=> SELECT component, thread_id, time FROM vertica_log limit 10; component | thread_id | time -----------+------------+------------------------- Init | 0x16321430 | 2014-04-02 04:02:02.613 Init | 0x16321430 | 2014-04-02 04:02:02.613 Init | 0x16321430 | 2014-04-02 04:02:02.613 Init | 0x16321430 | 2014-04-02 04:02:02.613 Init | 0x16321430 | 2014-04-02 04:02:02.613 Init | 0x16321430 | 2014-04-02 04:02:02.613 Init | 0x16321430 | 2014-04-02 04:02:02.613 | 0x16321430 | 2014-04-02 04:02:02.614 | 0x16321430 | 2014-04-02 04:02:02.614 | 0x16321430 | 2014-04-02 04:02:02.614 (10 rows)