Skip to main content
 首页 » 编程设计

python之在 or 条件下运行时如何使用 pyspark

2024年08月12日36wuhuacong

我正在尝试使用 withColumn 来清空数据框中列中的错误日期,我正在使用 when() 函数进行更新。对于“糟糕”的约会,我有两个条件。 1900 年 1 月之前的日期或 future 的日期。我当前的代码如下所示:

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))) 

我认为我的问题是它不喜欢或运算符“|” .从我在谷歌“|”上看到的是我应该使用的。我也试过“或”。任何人都可以建议我在这里做错了什么。

这是堆栈跟踪。

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``` 

请您参考如下方法:

这是运算符优先级的问题。 bool OR 运算符 or 的优先级低于比较运算符,所以

col(my_column) < 'X' or col(my_column) > 'Y' 

读作

(col(my_column) < 'X') or (col(my_column) > 'Y') 

但是按位或运算符 | 的优先级高于比较运算符 and

col(my_column) < 'X' | col(my_column) > 'Y' 

实际读作

col(my_column) < ('X' | col(my_column)) > 'Y' 

尽管 | 在 Column 类型上被重新定义为与 or 运算符具有相同的效果,但它的优先级没有改变,所以你需要手动给每个子表达式加上括号。