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

标签 python pyspark apache-spark-sql

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

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

但这会引发错误
ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.

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

谢谢。

最佳答案

您有运算符优先级问题,当比较与逻辑运算符(例如 &)混合时,请确保将比较运算符放在括号中。和 | ,用它固定,你甚至不需要 lit ,标量也应该起作用:

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

以下两项都应该有效:
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|
+---+---+----+

关于python - 比较两列以在 Spark DataFrame 中创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48389438/

相关文章:

apache-spark - 在S3中将sparkdataframe写入.csv文件,然后在pyspark中选择一个名称

mysql - Spark : com. mysql.jdbc.Driver 不允许创建表作为选择

python - 如何在Python中动态访问字典属性?

python - 带有字符串值的 codernitydb 索引

python - 如何打印gensim词典和语料库

apache-spark - 如何按多列分组并收集到 PySpark 中的列表中?

apache-spark - PySpark 在 2 个数据帧上应用函数,并在小型硬件上写入数十亿行的 csv

python - WebDriverException : Message: Service chromedriver unexpectedly exited. 状态代码为:127,在 Ubuntu 中使用 ChromeDriver 和 Selenium

azure - 如何使用pyspark以表格形式打印StringType()的 "dictionary"

python - 为什么pyspark中两种不同的数据处理方式会产生不同的结果?