gpt4 book ai didi

python - withColumn 不允许我使用 max() 函数生成新列

转载 作者:太空狗 更新时间:2023-10-30 02:18:02 25 4
gpt4 key购买 nike

我有这样一个数据集:

a = sc.parallelize([[1,2,3],[0,2,1],[9,8,7]]).toDF(["one", "two", "three"])

我想要一个数据集,它添加一个新列,该列等于其他三列中的最大值。输出看起来像这样:

+----+----+-----+-------+
|one |two |three|max_col|
+----+----+-----+-------+
| 1| 2| 3| 3|
| 0| 2| 1| 2|
| 9| 8| 7| 9|
+----+----+-----+-------+

我想我会使用 withColumn,像这样:

b = a.withColumn("max_col", max(a["one"], a["two"], a["three"]))

但这会产生错误

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/spark152/python/pyspark/sql/column.py", line 418, in __nonzero__
raise ValueError("Cannot convert column into bool: please use '&' for 'and', '|' for 'or', "
ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.

奇怪。 max 是否返回一个 bool?不符合the documentation on max .好的。很奇怪。

我觉得这行得通很奇怪:

b = a.withColumn("max_col", a["one"] + a["two"] + a["three"]))

它有效的事实让我更加强烈地认为 max 正在以某种我不理解的方式运行。

我也试过 b = a.withColumn("max_col", max([a["one"], a["two"], a["three"]])),它将三列作为列表而不是 3 个 separte 元素传递。这会产生与上述相同的错误。

最佳答案

实际上你在这里需要的是greatest而不是max:

from pyspark.sql.functions import greatest

a.withColumn("max_col", greatest(a["one"], a["two"], a["three"]))

为了完整起见,您可以使用 least 来找到最小值:

from pyspark.sql.functions import least

a.withColumn("min_col", least(a["one"], a["two"], a["three"]))

关于您看到的错误,它非常简单。 max 取决于丰富的比较。当您比较两列时,您会得到一个 Column:

type(col("a") < col("b")
## pyspark.sql.column.Column

PySpark 明确禁止将列转换为 bool 值(您可以查看 Column.__nonzero__ 来源),因为它毫无意义。它只是一个逻辑表达式,无法在驱动程序上下文中进行计算。

关于python - withColumn 不允许我使用 max() 函数生成新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37838361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com