日志OLAP:在SQL中使用UDF, lambda函数使用案例

简介: 场景 日志服务内置了20+类SQL函数。面对用户复杂的业务场景,例如使用json来沉淀业务数据,普通的SQL函数可能就无法满足需求,需要一些用户自定义处理逻辑。为了处理json类的业务数据,我们可以采用把json展开成多行的形式进行统计分析,今天我们介绍使用UDF(lambda)的方式来编写自定义逻辑,处理json、array、map类型的数据。

场景

日志服务内置了20+类SQL函数。面对用户复杂的业务场景,例如使用json来沉淀业务数据,普通的SQL函数可能就无法满足需求,需要一些用户自定义处理逻辑。为了处理json类的业务数据,我们可以采用把json展开成多行的形式进行统计分析,今天我们介绍使用UDF(lambda)的方式来编写自定义逻辑,处理json、array、map类型的数据。

数据样例:

__source__:  11.164.232.105
__tag__:__hostname__:  vm-req-170103232316569850-tianchi111932.tc
__topic__:  TestTopic_4
array_column:  [1,2,3]
double_column:  1.23
map_column:  {"a":1,"b":2}
text_column:  商品

lambda函数对array类型的数据进行求均值

为了遍历每一个array元素,并且把计算所有元素的均值,我们通过reduce函数进行计算。

* | select  array_column,  reduce( cast(  json_parse(array_column) as  array(bigint))  , CAST(ROW(0.0, 0) AS ROW(sum DOUBLE, count INTEGER))  ,  (s,x) -> cast(row( x+ s.sum,  s.count+1) as ROW(sum double, count INTEGER)), s -> IF(s.count = 0, NULL, s.sum / s.count))

image.png

reduce 函数的具体语义参考语法文档。参数分为四部分

  1. cast( json_parse(array_column) as array(bigint)) 表示输入的数组数据
  2. CAST(ROW(0.0, 0) AS ROW(sum DOUBLE, count INTEGER)) 定义起始状态为一个复杂的row类型,分别记录sum和count
  3. 对每一个元素,计算累加值,(s,x) -> cast(row( x+ s.sum, s.count+1) as ROW(sum double, count INTEGER)) s代表已经有的状态,x代表新输入的元素,计算结果通过cast强制定义为row类型
  4. 最后对最终状态,计算avg值,s -> IF(s.count = 0, NULL, s.sum / s.count)。s代表最终状态。

对所有行的array元素求avg:

* |  select  sum(rows.sum ) / sum(rows.count)  from(
           select  array_column,  reduce( cast(  json_parse(array_column) as  array(bigint))  , CAST(ROW(0.0, 0) AS ROW(sum DOUBLE, count INTEGER))  ,  (s,x) -> cast(row( x+ s.sum,  s.count+1) as ROW(sum double, count INTEGER)), s -> s)  as rows from log 
           )

通过子查询的方式,先reduce每一行的array的sum 和count。之后在嵌套查询中,求所有行的sum和count,最后相除求avg:

image.png

相关实践学习
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
目录
相关文章
|
4月前
|
人工智能 JSON 安全
无需复杂正则:SLS 新脱敏函数让隐私保护更简单高效
SLS 推出 mask 脱敏函数,支持 keyword 和 buildin 模式,简化敏感数据识别与处理,提升脱敏效率与性能,适用于结构化及非结构化日志。
240 38
|
4月前
|
SQL 传感器 人工智能
生成更智能,调试更轻松,SLS SQL Copilot 焕新登场!
阿里云日志服务(SLS)推出智能分析助手 SLS SQL Copilot,融合 AI 技术与日志分析最佳实践,将自然语言转换为 SQL 查询,降低使用门槛,提升查询效率。其具备原生集成、智能语义理解与高效执行能力,助力用户快速洞察日志数据价值,实现智能化日志分析新体验。
303 1
|
4月前
|
SQL 传感器 人工智能
生成更智能,调试更轻松,SLS SQL Copilot 焕新登场!
本文是阿里云日志服务(SLS)首次对外系统性地揭秘 SLS SQL Copilot 背后的产品理念、架构设计与核心技术积淀。我们将带你深入了解,这一智能分析助手如何从用户真实需求出发,融合前沿 AI 能力与 SLS 十余年日志分析最佳实践,打造出面向未来的智能化日志分析体验。
443 36
|
3月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
246 6
|
5月前
|
SQL 人工智能 数据挖掘
如何在`score`表中正确使用`COUNT`和`AVG`函数?SQL聚合函数COUNT与AVG使用指南
本文三桥君通过score表实例解析SQL聚合函数COUNT和AVG的常见用法。详解COUNT(studentNo)、COUNT(score)、COUNT()的区别,以及AVG函数对数值/字符型字段的不同处理,特别指出AVG()是无效语法。实战部分提供6个典型查询案例及结果,包含创建表、插入数据的完整SQL代码。产品专家三桥君强调正确理解函数特性(如空值处理、字段类型限制)对数据分析的重要性,帮助开发者避免常见误区,提升查询效率。
364 0
|
11月前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
404 2
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
SQL
数仓规范之sql编写规范
编写SQL时,应遵循以下规范:所有关键字小写,表别名按a, b, c...顺序使用,复杂逻辑多行书写,提高可读性。SELECT字段需逐行列出,避免使用*,GROUP BY字段同样处理。WHERE条件多于一个时,每条件一行。JOIN子表推荐使用嵌套查询方式1,明确关联条件,避免笛卡尔积。关键逻辑需注释,INSERT SELECT后最外层字段加注释说明用途。示例中展示了推荐的JOIN替代子查询的写法,以提高代码的可读性和维护性。
632 1
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")

相关产品

  • 日志服务