日志OLAP:在SQL中使用UDF, lambda函数使用案例
生活随笔
收集整理的這篇文章主要介紹了
日志OLAP:在SQL中使用UDF, lambda函数使用案例
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
場景
日志服務(wù)內(nèi)置了20+類SQL函數(shù)。面對用戶復(fù)雜的業(yè)務(wù)場景,例如使用json來沉淀業(yè)務(wù)數(shù)據(jù),普通的SQL函數(shù)可能就無法滿足需求,需要一些用戶自定義處理邏輯。為了處理json類的業(yè)務(wù)數(shù)據(jù),我們可以采用把json展開成多行的形式進(jìn)行統(tǒng)計(jì)分析,今天我們介紹使用UDF(lambda)的方式來編寫自定義邏輯,處理json、array、map類型的數(shù)據(jù)。
數(shù)據(jù)樣例:
__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函數(shù)對array類型的數(shù)據(jù)進(jìn)行求均值
為了遍歷每一個(gè)array元素,并且把計(jì)算所有元素的均值,我們通過reduce函數(shù)進(jìn)行計(jì)算。
* | 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))reduce 函數(shù)的具體語義參考語法文檔。參數(shù)分為四部分
對所有行的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:
總結(jié)
以上是生活随笔為你收集整理的日志OLAP:在SQL中使用UDF, lambda函数使用案例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回溯求解排列组合(求源码评论区留言)
- 下一篇: mysql修改字段默认值_MySQL增删