[英]how to use a pyspark when function with an or condition
我正在嘗試使用 withColumn 將數據框中列中的錯誤日期清零,我正在使用 when() 函數進行更新。 我對“壞”日期有兩個條件。 1900 年 1 月之前的日期或未來的日期。 我當前的代碼如下所示:
d = datetime.datetime.today()
df_out = df.withColumn(my_column, when(col(my_column) < '1900-01-01' | col(my_column) > '2019-12-09 17:01:37.774418', lit(None)).otherwise(col(my_column)))
我認為我的問題是它不喜歡 or 運算符“|” . 從我在谷歌“|”上看到的是我應該使用的。 我也試過“或”。 任何人都可以建議我在這里做錯了什么。
這是堆棧跟蹤。
df_out = df.withColumn(c, when(col(c) < '1900-01-01' | col(c) > '2019-12-09 17:01:37.774418', lit(None)).otherwise(col(c)))
File "C:\spark-2.4.4-bin-hadoop2.7\python\pyspark\sql\column.py", line 115, in _
njc = getattr(self._jc, name)(jc)
File "C:\spark-2.4.4-bin-hadoop2.7\python\lib\py4j-0.10.7-src.zip\py4j\java_gateway.py", line 1257, in __call__
File "C:\spark-2.4.4-bin-hadoop2.7\python\pyspark\sql\utils.py", line 63, in deco
return f(*a, **kw)
File "C:\spark-2.4.4-bin-hadoop2.7\python\lib\py4j-0.10.7-src.zip\py4j\protocol.py", line 332, in get_return_value
py4j.protocol.Py4JError: An error occurred while calling o48.or. Trace:
py4j.Py4JException: Method or([class java.lang.String]) does not exist```
這是運算符優先級的問題。 布爾 OR 運算符or
優先級低於比較運算符,因此
col(my_column) < 'X' or col(my_column) > 'Y'
讀作
(col(my_column) < 'X') or (col(my_column) > 'Y')
但是按位 OR 運算符|
具有比比較運算符更高的優先級,並且
col(my_column) < 'X' | col(my_column) > 'Y'
實際上讀作
col(my_column) < ('X' | col(my_column)) > 'Y'
盡管|
在Column
類型上重新定義與or
運算符具有相同的效果,它的優先級不會改變,因此您需要手動將每個子表達式括起來。
這只是運營商優先級的問題。 該錯誤告訴您pyspark
不能將OR
應用於字符串。 更具體地說,它試圖計算'1900-01-01' | col(c)
'1900-01-01' | col(c)
並告訴您它不知道該怎么做。 您只需要將表達式括起來即可。
df_out = df.withColumn(my_column, when((col(my_column) < '1900-01-01') | (col(my_column) > '2019-12-09 17:01:37.774418'), lit(None)).otherwise(col(my_column)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.