我有一個列包含一個數組的結構如下:
“列”:[{“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轉換?
嗨@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函數作為字符串解析的火花。同時,坳函數是指列“列”變換函數。
我希望這可以幫助!
嗨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的推斷返回類型。沒有這個,你可能會遇到錯誤或性能問題。
我希望這可以幫助,請讓我知道如果你有任何進一步的問題或擔憂。