鸿鹄使用 SQL 作为数据分析和查询的接口语言。鸿鹄平台支持标准的 SQL 语法,用户可以方便的交互式查询页面当中输入 SQL 语句,快速进行数据分析。
本文将简要介绍
如何在鸿鹄中使用基础的 SQL 功能进行数据的过滤和聚类分析。
如果你还对鸿鹄的数据集概念和 Schemaless SQL 的概念不熟悉,非常推荐先阅读一下两篇教程文章,先熟悉鸿鹄中和数据查询相关的基础概念,再进一步学习本文中的 SQL 基础。
基础概念:
鸿鹄中的数据集:
基础概念:
鸿鹄 Schemaless SQL:
本文中会使用到下面这个 Nginx access log 的样例数据,你可以将样例数据文件导入到鸿鹄当中。
●数据集选择: main
●数据格式选:nginx.access_log
如何从文件导入数据,可以参考 —— 功能介绍:
数据导入—导入文件:
使用 SELECT 关键字浏览数据集中的字段
鸿鹄 SQL 不同于关系型数据库的 SQL,查询结果集中的字段会随着查询的变化而动态的变化,这也是鸿鹄能够灵活处理非结构化数据的很重要的特点,由于数据集中没有预定义的 Schema,所以我们通常会使用SELECT *来查看结果集的所有字段。
例如,使用如下的 SQL 查询,可以查看到刚才导入的 Nginx access log 日志的所有字段。
运行结果如下图,红色的框部分,就可以看到结果集的所有字段,以及字段的值分布情况:
小技巧
由于鸿鹄数据集中没有预定义 Schema,在书写 SQL 查询的时候,也会遇到要选择的字段不容易记住字段名字的情况,因此,在交互式书写 SQL 的过程中,我们可以使用
SELECT path, agent, code , * FROM main WHERE _datatype = ‘nginx.access_log’
在选取想要的字段 path,agent,code 之外,还列出所有的字段,这样可以在左侧字段栏当中一直看到所有的字段信息。
当最终定稿 SQL 之后,再把 * 去掉,只保留自己想要选择的字段即可,例如:
SELECT path, agent, code , size FROM main WHERE _datatype = ‘nginx.access_log’
最佳实践
在大数据量的生产环境中,尽量要谨慎使用 SELECT * 获取所有字段,大部分字段都是在查询时动态提取的,如果获取所有字段,但是仅使用其中一部分,会浪费 CPU 资源。我们推荐尽量显示选取要使用的字段,减少不必要的计算,从而加速查询的速度。
如果在交互式查询中需要探索数据的字段结构,也推荐合理使用时间窗口设置,缩小查询扫描的数据范围,加快查询响应速度。
使用 WHERE 关键字,按字段过滤数据
在数据分析场景中,最常见的是需要根据某些字段的值,对查询结果做过滤。
例如,对 Nginx accesslog 的分析中,如果我们需要过滤出 HTTP 返回状态码是 404 的日志,则可以使用如下的 SQL 查询。
在这个 SQL 查询中,我们使用了字段code做数据的过滤。code 字段存储着每条 access log 中的 HTTP Status code 。
详细的WHERE关键字的使用,请参考:
http://www.yanhuangdata.com/honghu_manual/docs/search/sql_syntax/
使用 CONTAINS 函数选择包含关键字的数据
在日志分析场景中,我们经常需要查询过滤出包含某个关键字,或者是某几个关键字的日志,这个时候我们可以使用 CONTAINS 函数来实现。
例如,我们要从 Nginx access log 中选择出包含 mac 这个关键字的所有的日志,我们可以使用这样的 SQL
contains 函数需要作为 where 过滤条件,写在 where 条件语句当中。
如果要查询包含多个关键字的数据,例如,要查询包含 mac ,同时也包含 category 的日志,可以使用这样的SQL。
更多的关于CONTAINS函数的用法,可以参考
http://www.yanhuangdata.com/honghu_manual/docs/search/sql_syntax/
使用 GROUP BY 做聚合分析
在数据分析中,我们常常会做一些统计的聚类分析,例如,计算按照某个维度的值分类以后,某个数值的平均值,最大或者最小值等,此时我们可以通过 GROUP BY 语法关键字来实现。
GROUP BY 关键字之后,跟的是分类的维度字段,聚合函数则需要使用在 SELECT 关键字之后。
SQL 语法要求 GROUP BY 关键字需要放到 WHERE 筛选条件之后。
例子一:我们想要得到 Nginx accesslog 按照不同的 HTTP status code 分类之后,响应的请求数量,可以使用如下的 SQL
GROUP BY 的维度字段可以有多个,同时,聚合函数也可以使用多个不同的聚合函数。
例子二:我们想要得到按照不同的 HTTP status code 和 user agent 分类,然后统计出 HTTP 响应的数量,以及发送的数据字节总数。可以使用如下的 SQL
更多详细的 GROUP BY 语法和聚合函数的使用手册,可以参考:
http://www.yanhuangdata.com/honghu_manual/docs/search/sql_syntax/
使用 ORDER BY 对查询结果集进行排序
当需要对查询的结果集进行排序的时候,则可以使用 ORDER BY 关键字,需要注意的是,ORDER BY 排序是发生在 GROUP BY 之后的。
在上一节的 GROUP BY 的例子一的基础上,假设我们还需要对结果集按照 code 做降序排序,可以使用如下的语句
SQL 语法要求 ORDER BY 关键字需要放到 GROUP BY 关键字之后。
更多的 ORDER BY 排序的用法,可以参考:
http://www.yanhuangdata.com/honghu_manual/docs/search/sql_syntax/
进阶:更多的高级 SQL 功能
鸿鹄 SQL 提供了很多高级的 SQL 功能的支持,包括表函数,标量函数,CTE,窗口函数等。查看以下资料,可以进一步了解更多的鸿鹄 SQL 功能: