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

列相關異常在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

很簡單的實例,我確實執行好了,但是你是對的,關於性能,這是需要被監控。我相信SQL server會瘋狂的使用這種方法。

謝謝

拉古

自己的
貢獻者

Iav的解決方案。

自己的
貢獻者

Azure的磚可以利用ADF和運行這個函數使用SQL集成運行時同時攝入低SQL環境沒有任何依賴關係。

Johan_Van_Noten
新的貢獻者三世

謝謝各位,

@Lav Chandaria和@Raghu Bindinganavale的解決方案工作,但是如上表示的回答,我擔心的性能評估datediff(洗手間)或標簽(拉)沒有引擎的完整數據集能夠就切掉了“一半”的潛在結果基於單一<和信息從一個索引/分區。(拉)上看到我的評論。

我會在一個重要的數據集一旦我得到這個機會。

約翰

creastysomp
新的貢獻者二世

謝謝你的建議。我想做這個在SparkSQL是因為沒有底層。狀態"置疑"

Baidu
map