阿里云日志分析查询语法参考指南
前言 本博客你可以看到什么?
查询语法全文参考官方文档:点击查看
由于阿里的官方文档对查询和分析的案例相当匮乏,导致很多函数只能猜测用法,这种不断试错的过程是在是浪费时间,并且浪费精力!所以我打算写一篇关于阿里云查询的案例,由简入深的案例分析,希望对大家有所帮助。
一、查询语法
1. 查询所有的日志
*
:代指所有日志
2. 精确查询
业务:我们想对每条日志中的uuid进行筛选查询,则只需要指定字段
* and uuid:7dfc7e6b-9562-4c8a-9018-f085855f22ae
3. 模糊查询
业务:需要查询同一网段下的ip的日志情况,我们则可以使用模糊查询去匹配
* and ip:172.25.*
4. 查询关键词
常用的关键词and
、or
·、not
业务:查询ip为192.168.1.1,或者ip为192.168.1.0,并且日期不等于2021-08-09
* and ip:116.19.125.98 or ip:1.29.101.106 not time = '2021-06-08'
查询语法其实很简单,只需要对日志进行大的筛选即可,无需对日志进行复杂的分析,阿里云的日志不在于此,精髓就在于分析,分析语法比较诡异,和关系型数据库SQL有点像,但又不完全相同,其实思想是一样的,可以用SQL的思想去分析需要分析的结构。
二、分析语法
1、聚合函数
参考文档:聚合函数
聚合函数相对于传统的数据库丰富不少,使用方法基本一致
-
count 聚合
* | SELECT ip, count(*) from log group by ip
-
count_if 聚合
统计满足指定条件的日志条数-- ip 满足这个条件 '192.168.%' 才进行统计 * | SELECT ip, count_if(ip like '192.168.%') from log group by ip
-
max 聚合
-- 对每天进行分组,取最后访问的时间 (date_format后续章节会说到) * | SELECT max(time) from log group by (date_format(time, '%Y-%m-%d'))
-
max_by 聚合
max_by(KEY_01,KEY_02) :返回KEY_02为最大值时对应的KEY_01值。-- 统计 最后访问的ip * | SELECT max_by(ip, time) from log
2、字符串函数
参考文档:字符串函数
- split分割字符串
-- 按照空格拆分,拆分两个attr * | SELECT split(time, ' ', 2) as x from log
- lower 转小写
* | SELECT lower(source) from log
- 去除空格
trim:删除字符串中开头和结尾的空格。
ltrim:删除字符串中开头的空格。
3、时间函数
- 格式化日期
date_format(timestamp,format)
* | SELECT date_format(time, '%Y-%m-%d') from log
- 计算时间差
date_diff
:一般这个函数主要用于计算两个时间差,一般用于join时比对时间的方法,后续到join章节会有说明,这里不过多赘述
4、JSON函数
本章节是重点,因为日志中最纠结的地方如何拆分json,对json中的数据进行分析。
-
步骤一:json_parse(properties)
转化为阿里可识别的JSON类型* | select json_parse(properties) from log
-
步骤二:使用cast()函数转换数据类型
转化为map(varchar,varchar)类型,这里必须是同一数据类型,否则无法进行后续查询* | select cast(json_parse(properties) AS map(varchar,varchar)) from log
-
步骤三:unnest(特殊格式的日志字段进行查询分析)
在复杂的业务场景下,日志数据的某一列可能会是较为复杂的格式,例如数组(array)、对象(map)、JSON等格式。对这种特殊格式的日志字段进行查询分析,可以使用unnest语法。
-- 将map类型转化为 x,y 列 筛选条件 | SELECT x,y FROM log, unnest( cast(json_parse(properties) AS map(varchar,varchar)) ) AS t(x,y)
-
步骤四:对x,y,log的进行查询分析,后续分析就是和正常sql一样,x,y中的数据可以随意查询分组,可以满足大部分的负责的查询需求了。
5、unnest语法
参考官方文档:unnest语法 官方讲的比较清楚,具体案例解析json已经讲解了,这里就不过多赘述了
6、窗口函数
参考我之前的博客:开窗函数
-
rank() OVER 在窗口内,按照某一列排序,返回在窗口内的序号
日志筛选关键词 | SELECT ip, time, user_id, rank() OVER (PARTITION BY user_id ORDER BY time DESC) AS rnk FROM log
关键:
rank() OVER (PARTITION BY user_id ORDER BY time DESC) AS rnk
(表示查询的结果集按照user_id聚合,并且按照time升序进行排序,rnk是分组后的排序序号,同等级rnk一致)
解析:rank()是一个聚合函数,可以使用分析语法中的任何函数,也可以使用本文档列出的函数。PARTITION BY 是值按照哪些桶进行计算。
-
row_number
row_number() OVER (PARTITION BY user_id ORDER BY time DESC) AS rnk
(返回在窗口内的行号)
-
first_value
first_value(time) OVER (PARTITION BY user_id ORDER BY time DESC) AS rnk
(返回窗口内第一time的值)
三、怎么查去哪查
如上就是阿里云存储的基本查询指南,掌握这些,基本可以应对大部分的日志分析查询方法了!
其实大部分的语法和sql十分类似,核心问题就是如何将字段的json展开是个大问题,只要会展开,其他的都是小kiss。
如果是相对复杂的join查询也是可以的,只不过写起来不美观,可以参考官方文档来学习剩下的查询分析语法。