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

如何應用一個UDF在結構體的數組屬性

rbelidrv
新的貢獻者二世

我有一個列包含一個數組的結構如下:

“列”:[{“struct_field1”:“struct_value”、“struct_field2”:“struct_value”}, {“struct_field1”:“struct_value”、“struct_field2”:“struct_value”}]

我想申請一個udf每個字段的結構。我目前想做的這個使用變換然而似乎並不奏效,因為udf不是接收上下文。

我得到的錯誤是“不能為表達式生成代碼:<λ>(λx_1 # 123. struct_field1) # 45678”

df。選擇(變換(“列”,λx:結構(my_udf_for (x.struct_field1) .alias (“struct_field1”), my_udf_for (x.struct_field2) .alias (“struct_field2”))) .alias(“列”))

我怎麼巢內一個udf轉換?

3回複3

Kaniz
社區經理
社區經理

嗨@Richard Belihomji,看起來你想應用一個UDF的結構體數組中每個字段列DataFrame火花。然而,看來你遇到一個問題的UDF不接收上下文。

內嵌套一個UDF轉換,您可以定義中的UDF分開,然後叫它變換函數。這裏是一個例子如何應用一個UDF每個字段的結構體數組列:

從pyspark.sql。功能導入udf、結構、從pyspark.sql坳。類型進口StringType # define UDF my_udf = UDF(λx: x.upper()如果x不是沒有別人沒有,StringType()) #應用UDF數組中每個字段的結構df列。selectExpr(“變換(列,x - >結構(my_udf (x.struct_field1) .alias (“struct_field1”), my_udf (x.struct_field2) .alias (struct_field2)))列”)

在這個例子中,使用UDF的UDF分別定義函數,然後調用中

變換函數使用lambda函數應用UDF每個字段的結構體數組的列。注意,selectExpr方法用於通過lambda函數作為字符串解析的火花。同時,坳函數是指列“列”變換函數。

我希望這可以幫助!

rbelidrv
新的貢獻者二世

嗨Kaniz,

謝謝你的回應。然而,這看起來不像你的代碼編譯。你引用udf在SQL沒有登記udf。你也似乎混合pyspark SQL查詢內的代碼,在你使用別名。

即使我修複這些問題與你的代碼,它仍然不執行,我得到同樣的錯誤:

SparkUnsupportedOperationException(內部錯誤):不能生成代碼表達式:my_udf(λx # 306. struct_field1) # 307

感激如果你能建議如果這種預期行為或者支持的功能。

匿名
不適用

@Richard Belihomji:請試試這個

應用一個UDF使用PySpark屬性的結構體數組中,您可以定義你的UDF Python函數使用UDF的方法從pyspark.sql.functions並注冊它。然後,您可以使用getItem方法從結構中提取一個特定的字段的值,並將它作為參數傳遞給你的UDF。

這裏有一個例子代碼片段展示了如何做到這一點:

從pyspark.sql。功能導入udf、結構、坳#定義您的udf @udf def my_udf (x):返回x.upper() #應用中的udf struct_field1財產df = df的結構體數組。withColumn(“列”,變換(坳(“列”),λx:結構(my_udf (x.getItem (“struct_field1”)) .alias (“struct_field1”), x.getItem .alias (“struct_field2”) (“struct_field2”))))

在這個例子中,我們定義了一個叫做my_udf的UDF,將輸入字符串轉換為大寫。然後我們使用withColumn方法應用變換函數列數組。lambda函數傳遞給變換,我們使用getItem方法提取struct_field1屬性的值,並將它作為參數傳遞給my_udf。然後,我們使用別名方法將結果列重命名為struct_field1。同樣的,我們提取struct_field2屬性使用

使用別名getItem,重命名它。

注意,重要的是要注冊UDF使用@udf裝飾,因為這允許PySpark UDF的推斷返回類型。沒有這個,你可能會遇到錯誤或性能問題。

我希望這可以幫助,請讓我知道如果你有任何進一步的問題或擔憂。

歡迎來到磚社區:讓學習、網絡和一起慶祝

加入我們的快速增長的數據專業人員和專家的80 k +社區成員,準備發現,幫助和合作而做出有意義的聯係。

點擊在這裏注冊今天,加入!

參與令人興奮的技術討論,加入一個組與你的同事和滿足我們的成員。

Baidu
map