簡體   English   中英

使用或條件函數時如何使用pyspark

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM