在 pyspark-2.3 中使用 python 内置函数 **abs** 时出错
Error using python built in function **abs** in pyspark-2.3
我试图通过在 pyspark shell-2.3.
中使用内置 abs 函数的 python 将负数转换为正数
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
. There are not designed to be evaluated outside DataFrame
context, and operate on Columns
。
你可以使用文字 Column
:
from pyspark.sql.functions import abs, lit
abs(lit(numb))
但它会给你另一个 Column
:
Column<b'abs(-2)'>
虽然理论上此类对象 ,但不适合 public 使用。
如果你想对普通的 Python 数字进行操作,只需坚持 Python's built-in 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 方法,但那是针对 DataFrame 列的。
如果您在 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)
我们应该避免直接导入函数名称,并尝试使用模块的别名,这样才能调用我们想要的正确方法。
我试图通过在 pyspark shell-2.3.
中使用内置 abs 函数的 python 将负数转换为正数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
. There are not designed to be evaluated outside DataFrame
context, and operate on Columns
。
你可以使用文字 Column
:
from pyspark.sql.functions import abs, lit
abs(lit(numb))
但它会给你另一个 Column
:
Column<b'abs(-2)'>
虽然理论上此类对象
如果你想对普通的 Python 数字进行操作,只需坚持 Python's built-in 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 方法,但那是针对 DataFrame 列的。
如果您在 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)
我们应该避免直接导入函数名称,并尝试使用模块的别名,这样才能调用我们想要的正确方法。