取消
顯示的結果
而不是尋找
你的意思是:

列相關異常在SQL UDF使用UDF時參數。

Johan_Van_Noten
新的貢獻者三世

環境

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的內參數表達式。

  • 這是一個正確的結論嗎?
  • 這種限製的理由嗎?
  • 替代解決這個嗎?
19日回複19

Johan_Van_Noten
新的貢獻者三世

嗨Iav

不幸的是,我沒能解決這個問題或工作。

基於@Jose岡薩雷斯的回複,我一直在閱讀文檔他指出我在SparkSQL得出結論,這是不可能的。這明顯禁用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

洗手間
新的貢獻者三世

我已經使用diff符號函數來確定日期。

裏斯
新的貢獻者二世

嗨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);

Robert_Smith
新的貢獻者二世

這個UDF接受兩個參數startDate可以和tillDate,並返回一個整數。在sql server中創建一個udf返回類型的整數。

Baidu
map