以下内容不是 SQL 与 Splunk 搜索命令之间的精确映射,但是,如果您熟悉 SQL,这一快速对比可以帮助您快速熟悉Splunk 的使用。
概念:
从数据库的角度来说,Splunk 是一个具有隐式时间维度的分布式、非关系型、半结构化的数据库。Splunk 不是一个标准意义上的数据库 - 关系数据库要求提前定义所有表列并且不会在只插入新硬件的情况下自动扩展 - 但是,Splunk 中有许多与数据库领域相似的概念。
SQL 查询 与 Splunk 搜索 的关系
Splunk 搜索是对索引数据进行检索,并且可以执行转换和报告操作。可以将搜索所获得的结果通过管道符从一个命令传递或传输到另一个命令,以对这些结果进行过滤、修改、重新排序和分组。
表/视图 与 搜索结果 的关系
可将搜索结果视为数据库视图,一个动态生成的具有行和列的表。
数据库的index和splunk的 index 的关系
在 Splunk 中,会对所有值和字段进行索引,因此不需要手动添加、更新、丢弃,甚至不需要考虑对列建立索引的问题。系统可以自动快速地检索一切内容。
SQL的 row(行)和splunk的 结果/事件
Splunk 中的结果是⼀个包含字段(即,列)值的列表,对应于表格的⾏。事件是指具有时间戳和原始⽂本的结果。通常,事件是⽇志⽂件中的⼀条记录,例如:
173.26.34.223 - - [01/Jul/2009:12:05:27 -0700] "GET /trade/app?action=logout
HTTP/1.1" 200 2953
column(纵行)和splunk的 field(字段)
Splunk 中的字段从搜索中动态地返回,这意味着⼀个搜索可能会返回⼀组字段,⽽
另⼀个搜索可能会返回另⼀组字段。在告知 Splunk 如何从原始底层数据提取出更多
字段后,同⼀个搜索将返回⽐之前多的字段。Splunk 中的字段不与数据类型关联。
SQL数据库/⽅案和splunk的 索引/应⽤
在 Splunk 中,索引是⼀个数据集合,这与⼀个数据库是⼀个表集合相似。对应数据的域知识、如何提取、运⾏哪些报告等等都存储在 Splunk 应⽤中。
从SQL到splunk
SQL 命令 | SQL ⽰例 | Splunk ⽰例 |
GROUP BY
| SELECT mycolumn, avg(mycolumn) FROM mytable WHERE mycolumn=value GROUP BY mycolumn | source=mytable mycolumn=value | STATS avg(mycolumn) BY mycolumn | FIELDS mycolumn, avg(mycolumn)
|
HAVING
| SELECT mycolumn, avg(mycolumn) FROM mytable WHERE mycolumn=value GROUP BY mycolumn HAVING avg(mycolumn)=value | source=mytable mycolumn=value | STATS avg(mycolumn) BY mycolumn |SEARCH avg(mycolumn)=value | FIELDS mycolumn, avg(mycolumn)
|
LIKE
| SELECT mycolumn, avg(mycolumn) FROM mytable WHERE mycolumn LIKE "%some text%" | source=mytable mycolumn="*some text*" 注意:Splunk 中最常见的搜索⽤法实际上在 SQL 中是几乎⽆法实现的 - 即在所有字段中搜 索⼦字符串。下⾯的搜索将返回在任意位置包 含 "some text" 的所有⾏: source=mytable "some text" |
ORDER BY
| SELECT * FROM mytable ORDER BY mycolumn desc | source=mytable | SORT=mycolumn
|
SELECT DISTINCT (不同)
| SELECT DISTINCT mycolumn1, mycolumn2 FROM mytable | source=mytable |DEDUP mycolumn1 | FIELDS mycolumn1, mycolumn2 (去重) |
SELECT TOP | SELECT TOP 5 mycolumn1, mycolumn2 FROM mytable | source=mytable | TOP mycolumn1, mycolumn2 |
INNER JOIN
| SELECT * FROM mytable1 INNER JOIN mytable2 ON mytable1.mycolumn=mytable2.mycolumn | source=mytable1 | JOIN type=inner mycolumn [ SEARCH source=mytable2 ] 注意:还可以通过其他两种⽅法来执⾏连接: 使⽤查找命令来添加外部表中的字段: ... | LOOKUP myvaluelookup mycolumn OUTPUT myoutputcolumn 使⽤⼦搜索: source=mytable1 [ SEARCH source=mytable2 mycolumn2=myvalue | FIELDS mycolumn2 ] |
LEFT (OUTER) JOIN
| SELECT * FROM mytable1 LEFT JOIN mytable2 ON mytable1.mycolumn=mytable2.mycolumn | source=mytable1 | JOIN type=left mycolumn [ SEARCH source=mytable2 ] |
SELECT INTO
| SELECT * INTO new_mytable IN mydb2 FROM old_mytable | source=old_mytable | EVAL source=new_mytable | COLLECT index=mydb2 注意:COLLECT 通常⽤于将计算开销极⼤的 字段存储回 Splunk 中,以提⾼将来的访问速 度。⽬前列举的⽰例是⼀个⾮典型⽰例,仅供 与 SQL 命令对⽐之⽤。source 将被重命名为 orig_source |
TRUNCATE TABLE | TRUNCATE TABLE mytable (截断) | source=mytable | DELETE |
INSERT INTO
| INSERT INTO mytable VALUES (value1, value2, value3,....) | 注意:请参阅 SELECT INTO。如果需要,各 个记录的添加可以不使⽤搜索语⾔,⽽是使⽤ API |
UNION (联合)
| SELECT mycolumn FROM mytable1 UNION SELECT mycolumn FROM mytable2 | source=mytable1 | APPEND [ SEARCH source=mytable2] | DEDUP mycolumn |
UNION ALL
| SELECT * FROM mytable1 UNION ALL SELECT * FROM mytable2 | source=mytable1 | APPEND [ SEARCH source=mytable2] |
DELETE
| DELETE FROM mytable WHERE mycolumn=5 | source=mytable mycolumn=5 | DELETE |
UPDATE
| UPDATE mytable SET column1=value, column2=value,... WHERE some_column=some_value | 注意:在 Splunk 中更新记录时需要考虑几点 事项。⾸先,您可以只将新值添加到 Splunk 中(请参阅 INSERT INTO),⽽不必担⼼删 除旧值,因为 Splunk 会始终⾸先返回最新的 结果。其次,在检索时,您可以始终去除重复 结果,以确保只使⽤最新值(请参阅 SELECT DISTINCT)。最后,您实际上可以删除旧记 录(请参阅 DELETE)。 |