开发者社区> 云雷> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

日志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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java Lambda 的秘密 | Java Debug 笔记
Java Lambda 的秘密 | Java Debug 笔记
31 0
封装自己的dapper lambda扩展-设计篇(一)
封装自己的dapper lambda扩展-设计篇(一)
27 0
编写自己的dapper lambda扩展-使用篇
编写自己的dapper lambda扩展-使用篇
56 0
CentOS 7-(64位)系统下安装Anaconda(Python3.x)及pip使用
CentOS 7-(64位)系统下安装Anaconda(Python3.x)及pip使用
34 0
SAP UI5应用debug级别的日志打印如何设置
SAP UI5应用debug级别的日志打印如何设置
48 0
使用log4js打印日志
不管在做任何开发的时候,打印日志都是很重要的功能。 在Node.js中,最普通的打日志的方式就是console.log。 如果要写到文件中,或者是要跟高级的log系统对接,我们就需要专门的模块,比如log4js。
7706 0
c/c++_Lua交互----关于Lua中table类型的使用实例
lua中的复合类型 只有table 类型,你可以当做任意容器使用  ,比如 数组    PHP中的关联数组  C++中的 std::map 等等  而且提供了很方便的使用 下面是lua中 table类型的使用 c++加载代码  #include "string.
803 0
+关注
云雷
日志计算驱动业务增长 让天下没有难分析的日志
104
文章
2
问答
来源圈子
更多
阿里云存储基于飞天盘古2.0分布式存储系统,产品包括对象存储OSS、块存储Block Storage、共享文件存储NAS、表格存储、日志存储与分析、归档存储及混合云存储等,充分满足用户数据存储和迁移上云需求,连续三年跻身全球云存储魔力象限四强。
+ 订阅
相关文档: 混合云容灾服务 混合云备份服务 日志服务
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载