我正在尝试使用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运算符“ |” 。根据我在Google上看到的“ |”这是我应该使用的。我也尝试过“或”。谁能建议我在这里做错了什么。
这是堆栈跟踪。
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```
答案 0 :(得分:2)
这是运算符优先级的问题。布尔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
运算符具有相同的作用,但是它的优先级没有改变,因此您需要手动在每个子表达式中加上括号。>
答案 1 :(得分:1)
这只是运营商优先级的问题。错误告诉您data <- data.frame(replicate(5,sample(0:5,10,rep=TRUE)))
data
# X1 X2 X3 X4 X5
# 1 2 5 1 3 3
# 2 0 5 4 4 2
# 3 1 2 1 1 1
# 4 3 5 4 2 5
# 5 5 1 1 5 4
# 6 2 4 0 2 0
# 7 1 4 1 1 0
# 8 1 4 1 2 0
# 9 1 0 5 0 4
# 10 4 3 0 1 1
table(as.matrix(data))
# 0 1 2 3 4 5 # <- unique values
# 8 15 7 4 9 7 # <- frequency
无法将pyspark
应用于字符串。更具体地说,它正在尝试计算OR
,并告诉您它不知道如何执行。您只需要在表达式上加上括号即可。
'1900-01-01' | col(c)