您好,登錄后才能下訂單哦!
在SQL中使用UDF和lambda函數(shù)使用示例分析,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
摘要: 場景 日志服務內(nèi)置了20+類SQL函數(shù)。面對用戶復雜的業(yè)務場景,例如使用json來沉淀業(yè)務數(shù)據(jù),普通的SQL函數(shù)可能就無法滿足需求,需要一些用戶自定義處理邏輯。為了處理json類的業(yè)務數(shù)據(jù),我們可以采用把json展開成多行的形式進行統(tǒng)計分析,今天我們介紹使用UDF(lambda)的方式來編寫自定義邏輯,處理json、array、map類型的數(shù)據(jù)。
日志服務內(nèi)置了20+類SQL函數(shù)。面對用戶復雜的業(yè)務場景,例如使用json來沉淀業(yè)務數(shù)據(jù),普通的SQL函數(shù)可能就無法滿足需求,需要一些用戶自定義處理邏輯。為了處理json類的業(yè)務數(shù)據(jù),我們可以采用把json展開成多行的形式進行統(tǒng)計分析,今天我們介紹使用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: 商品
為了遍歷每一個array元素,并且把計算所有元素的均值,我們通過reduce函數(shù)進行計算。
* | 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ù)分為四部分
cast( json_parse(array_column) as array(bigint))
表示輸入的數(shù)組數(shù)據(jù)
CAST(ROW(0.0, 0) AS ROW(sum DOUBLE, count INTEGER))
定義起始狀態(tài)為一個復雜的row類型,分別記錄sum和count
對每一個元素,計算累加值,(s,x) -> cast(row( x+ s.sum, s.count+1) as ROW(sum double, count INTEGER))
s代表已經(jīng)有的狀態(tài),x代表新輸入的元素,計算結果通過cast強制定義為row類型
最后對最終狀態(tài),計算avg值,s -> IF(s.count = 0, NULL, s.sum / s.count)
。s代表最終狀態(tài)。
* | 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:
關于在SQL中使用UDF和lambda函數(shù)使用示例分析問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業(yè)資訊頻道了解更多相關知識。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。