環境
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
我有一個工作。如果這能幫助你。下麵是我寫的查詢
目標查詢:
創建或替換函數TestAverage (DateBudget日期)返回浮動
返回選擇Avg (pd.Amount)
從TestTable1 pd
離開加入TestTable2呃
er。PK = pd.Exchange_Rate_PK
標誌(DATEDIFF (DateBudget date_add (to_date (pd.From_Date), 1))) = 1
並簽署(DATEDIFF (DateBudget date_add (to_date (pd.To_Date), 1))) = 1;
原始查詢:
選擇AVG (pd.Amount)數量
從TestTable1 pd
離開加入TestTable2呃
er。PK = pd.Exchange_Rate_PK
fci的地方。DATEBUDGET > = pd.From_Date
和fci。DATEBUDGET < = pd.To_Date
嗨Iav,
簽我還得到相關列錯誤,任何想法嗎?
如果不存在創建函數rw_weekday_diff (start_date日期、end_date日期)
返回INT
評論的計算兩個日期之間的天不包括周末
返回DATEDIFF(天,start_date end_date)
——(DATEDIFF(星期,end_date start_date) * 2)
(案例當dayofweek (start_date) = 1 1 0結束)
+(當dayofweek (start_date) = 7那麼其他1 0結束)
——(SELECT COUNT(*)從bank_holidays h
標誌(DATEDIFF (h。日期、date_add (to_date (start_date), 1))) = 1
標誌(DATEDIFF (h。日期、date_add (to_date (end_date), 1))) = 1);
——原始where子句(從bank_holidays選擇COUNT (*)。uk_bank_holidays h, h。日期> = start_date和h。日期= end_date);