比较两列以在 Spark DataFrame 中创建新列

Pra*_*ada 3 python apache-spark-sql pyspark

我有一个包含 2 列的 Spark DataFrame,我正在尝试使用其他两列和 when else 操作创建一个新列。

df_newcol = df.withColumn("Flag", when(col("a") <= lit(ratio1) | col("b") <= lit(ratio1), 1).otherwise(2))
Run Code Online (Sandbox Code Playgroud)

但这会引发错误

ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.
Run Code Online (Sandbox Code Playgroud)

我之前在一个列中使用过 when 和 else ,而在多列中使用它时,我们是否必须以不同的方式编写逻辑。

谢谢。

Psi*_*dom 7

您有一个运算符优先级问题,当比较与逻辑运算符(如&and )混合时,请确保将比较运算符放在括号中|,并且已修复,您甚至不需要lit,标量也应该可以工作:

import pyspark.sql.functions as F
df = spark.createDataFrame([[1, 2], [2, 3], [3, 4]], ['a', 'b'])
Run Code Online (Sandbox Code Playgroud)

以下两项都应该有效:

df.withColumn('flag', F.when((F.col("a") <= F.lit(2)) | (F.col("b") <= F.lit(2)), 1).otherwise(2)).show()
+---+---+----+
|  a|  b|flag|
+---+---+----+
|  1|  2|   1|
|  2|  3|   1|
|  3|  4|   2|
+---+---+----+

df.withColumn('flag', F.when((F.col("a") <= 2) | (F.col("b") <= 2), 1).otherwise(2)).show()
+---+---+----+
|  a|  b|flag|
+---+---+----+
|  1|  2|   1|
|  2|  3|   1|
|  3|  4|   2|
+---+---+----+
Run Code Online (Sandbox Code Playgroud)

  • 这个逻辑可以用来自不同数据帧的列来完成吗?比如说,df1 中的 a 列和 df2 中的 b 列,以及 df1 中的标志。@Psidom (3认同)