论如何使用基础的 SQL 功能进行数据的过滤和聚类分析

  • Post author:
  • Post category:其他


鸿鹄使用 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 功能:


●功能介绍:SQL 公共表表达式(CTE)


●功能介绍:SQL 窗口函数


●功能介绍:SQL 表函数


●功能介绍:SQL 视图


●标量函数列表



版权声明:本文为Yhpdata888原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。