带有or条件的函数时如何使用pyspark

时间:2019-12-10 15:03:14

标签: python apache-spark pyspark

我正在尝试使用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```

2 个答案:

答案 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'

尽管在|类型上重新定义了Columnor运算符具有相同的作用,但是它的优先级没有改变,因此您需要手动在每个子表达式中加上括号。

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