我正在嘗試從when()函式鏈中的字典中獲取條件reduce(),最后將其傳遞給dataframe.withColumn().
例如:
conditions = {
"0": (col("a") == 1.0) & (col("b") != 1.0),
"1": (col("c") == 1.0) & (col("d") == 1.0)
}
使用 reduce() 我實作了這個:
when_stats = reduce(lambda key, value: when(conditions[key], lit(key)), conditions)
然后在 withColumn() 中使用它:
df2 = df1.withColumn(result, when_stats)
問題是它只接受第一個條件“0”并且不鏈接第二個條件。列印“when_stats”給了我:
Column<'CASE WHEN ((a = 1.0) AND (NOT (b = 1.0))) THEN 0 END'>
當我添加第三個條件時,它會引發錯誤并且不起作用:
TypeError:不可散列的型別:“列”
所以問題是,我怎樣才能遍歷字典并創建完整的when().when().when()...?如果我想最后有更好的解決方案otherwise()嗎?
uj5u.com熱心網友回復:
當您使用reducedict 物件時,您實際上是在迭代 dict 的鍵。因此 lambda 函式采用acc累加器和key正在處理的實際密鑰。
您可以改用它:
from functools import reduce
from pyspark.sql import functions as F
conditions = {
"0": (F.col("a") == 1.0) & (F.col("b") != 1.0),
"1": (F.col("c") == 1.0) & (F.col("d") == 1.0)
}
when_stats = reduce(
lambda acc, key: acc.when(conditions[key], key),
conditions,
F
) #.otherwise("default_value")
print(when_stats)
# Column<'CASE WHEN ((a = 1.0) AND (NOT (b = 1.0))) THEN 0 WHEN ((c = 1.0) AND (d = 1.0)) THEN 1 END'>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/436859.html
標籤:Python 阿帕奇火花 pyspark apache-spark-sql 函数式编程
