日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2023/12/10 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 日志OLAP:在SQL中使用UDF, lambda函数使用案例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

場景

日志服務內置了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))

reduce 函數的具體語義參考語法文檔。參數分為四部分

  • cast( json_parse(array_column) as array(bigint)) 表示輸入的數組數據
  • CAST(ROW(0.0, 0) AS ROW(sum DOUBLE, count INTEGER)) 定義起始狀態為一個復雜的row類型,分別記錄sum和count
  • 對每一個元素,計算累加值,(s,x) -> cast(row( x+ s.sum, s.count+1) as ROW(sum double, count INTEGER)) s代表已經有的狀態,x代表新輸入的元素,計算結果通過cast強制定義為row類型
  • 最后對最終狀態,計算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:

    總結

    以上是生活随笔為你收集整理的日志OLAP:在SQL中使用UDF, lambda函数使用案例的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。