環境
Azure磚10.1,包括3.2.0火花
場景
我想要檢索的平均兩個時間戳之間的一係列的值,使用一個SQL UDF。
平均顯然隻是一個例子。在真實的場景中,我想隱藏一些額外的查詢SQL UDF背後的複雜性。
試(工作)
% sql SELECT avg(溫度)從oventemperatures averageTemperature ovenTimestamp to_timestamp之間(“1999-01-01”)和to_timestamp (“2021-12-31”)
這可能在一個UDF。
創建函數averageTemperatureUDF (ovenID字符串,開始時間的時間戳,endTime時間戳)返回讀取SQL數據浮動SQL安全定義者返回選擇avg (ovenTemperature)從oventemperatures averageTemperature ovenTimestamp to_timestamp之間(“1999-01-01”)和to_timestamp (“2021-12-31”)
試(失敗)
當我想使用UDF的過濾條件參數,函數定義失敗。
創建函數averageTemperatureUDF (ovenID字符串,開始時間的時間戳,endTime時間戳)返回讀取SQL數據浮動SQL安全定義者返回選擇avg (ovenTemperature)從oventemperatures averageTemperature ovenTimestamp開始時間和endTime之間
錯誤消息抱怨“相關列”。
錯誤的SQL語句:AnalysisException:相關列是不允許謂詞(spark_catalog.default.oventemperatures.ovenTimestamp > =外(averageTemperatureUDF.startTime)) (spark_catalog.default.oventemperatures.ovenTimestamp < =外(averageTemperatureUDF.endTime)):總(avg (ovenTemperature # 275) averageTemperature # 9299) + -過濾器((ovenTimestamp # 273 > =外(開始時間# 9301))和(ovenTimestamp # 273 < =外(endTime # 9302))) + - SubqueryAlias spark_catalog.default.oventemperatures + -關係default.oventemperatures [ovenTimestamp # 273, (…), ovenTemperature # 275, (……)] JDBCRelation (OvenTemperatures) (numPartitions = 1)
問題(s)
似乎不接受使用UDF的內參數表達式。
嗨@Johan Van Noten
很簡單的實例,我確實執行好了,但是你是對的,關於性能,這是需要被監控。我相信SQL server會瘋狂的使用這種方法。
謝謝
拉古