在 pyspark-2.3 中使用 python 内置函数 **abs** 时出错



我试图通过在pyspark shell-2.3中使用内置的abs函数将负数转换为正数。

numb = -2
print(abs(numb))

它给我抛出了一个奇怪的错误:

py4j.protocol.Py4JError: An error occurred while calling z:org.apache.spark.sql.functions.abs. Trace:
**py4j.Py4JException: Method abs([class java.lang.Integer]) does not exist
    at**
py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:318)
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:339)
    at py4j.Gateway.invoke(Gateway.java:276)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.lang.Thread.run(Thread.java:745) 

你能帮帮我吗?

这不是你使用 pyspark.sql.functions 的方式。没有设计用于在DataFrame上下文之外进行评估,并在Columns上运行。

您可以使用文字Column

from pyspark.sql.functions import abs, lit 
abs(lit(numb))

但它会给你另一个Column

Column<b'abs(-2)'>

虽然理论上可以在本地评估此类对象,但它不适合公共使用。

如果你想在普通的Python数字上操作,只需坚持使用Python的内置abs

如果已对内置函数进行着色,则可以从注释中将该函数表示为:

def math_result(current_val, value): 
    result = ((value - current_val) / value)  *100 
    return __builtins__.abs(__builtins__.round(result, 2)) 
math_result(1, 3)                                            
## 66.67

Python 有内置的 abs 方法。

pyspark 还提供 abs 方法,但该方法适用于数据帧列。

如果你在pyspark shell中导入pyspark方法'abs',那么你确实覆盖了内置的abs方法。

看起来你有覆盖abs方法,如下所示:

>>> print(abs(-3))
3
>>> from pyspark.sql.functions import abs
>>> print(abs(-3))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/rs301t/spark-2.3.2-bin-hadoop2.7/python/pyspark/sql/functions.py", line 42, in _
    jc = getattr(sc._jvm.functions, name)(col._jc if isinstance(col, Column) else col)
  File "/Users/rs301t/spark-2.3.2-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
  File "/Users/rs301t/spark-2.3.2-bin-hadoop2.7/python/pyspark/sql/utils.py", line 63, in deco
    return f(*a, **kw)
  File "/Users/rs301t/spark-2.3.2-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 z:org.apache.spark.sql.functions.abs. Trace:
py4j.Py4JException: Method abs([class java.lang.Integer]) does not exist
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:318)
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:339)
    at py4j.Gateway.invoke(Gateway.java:276)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.lang.Thread.run(Thread.java:748)

我们应该避免直接导入函数名称,并尝试为模块使用别名,以便可以调用我们想要的正确方法。

最新更新