【问题标题】:Pandas scalar UDF failing, IllegalArgumentException熊猫标量 UDF 失败,IllegalArgumentException
【发布时间】:2020-02-15 21:32:04
【问题描述】:

首先,如果我的问题很简单,我深表歉意。我确实花了很多时间研究它。

我正在尝试在 PySpark 脚本中设置标量 Pandas UDF,如 here 所述。

这是我的代码:

from pyspark import SparkContext
from pyspark.sql import functions as F
from pyspark.sql.types import *
from pyspark.sql import SQLContext
sc.install_pypi_package("pandas")
import pandas as pd
sc.install_pypi_package("PyArrow")

df = spark.createDataFrame(
    [("a", 1, 0), ("a", -1, 42), ("b", 3, -1), ("b", 10, -2)],
    ("key", "value1", "value2")
)

df.show()

@F.pandas_udf("double", F.PandasUDFType.SCALAR)
def pandas_plus_one(v):
    return pd.Series(v + 1)

df.select(pandas_plus_one(df.value1)).show()
# Also fails
#df.select(pandas_plus_one(df["value1"])).show()
#df.select(pandas_plus_one("value1")).show()
#df.select(pandas_plus_one(F.col("value1"))).show()

脚本在最后一条语句处失败:

调用 o209.showString 时出错。 : org.apache.spark.SparkException:作业因阶段失败而中止: 阶段 8.0 中的任务 2 失败 4 次,最近一次失败:丢失任务 2.3 在 8.0 阶段(TID 30,ip-10-160-2-53.ec2.internal,执行器 3): java.lang.IllegalArgumentException 在 java.nio.ByteBuffer.allocate(ByteBuffer.java:334) 在 org.apache.arrow.vector.ipc.message.MessageSerializer.readMessage(MessageSerializer.java:543) 在 org.apache.arrow.vector.ipc.message.MessageChannelReader.readNext(MessageChannelReader.java:58) 在 org.apache.arrow.vector.ipc.ArrowStreamReader.readSchema(ArrowStreamReader.java:132) 在 org.apache.arrow.vector.ipc.ArrowReader.initialize(ArrowReader.java:181) 在 org.apache.arrow.vector.ipc.ArrowReader.ensureInitialized(ArrowReader.java:172) 在 org.apache.arrow.vector.ipc.ArrowReader.getVectorSchemaRoot(ArrowReader.java:65) 在 org.apache.spark.sql.execution.python.ArrowPythonRunner$$anon$1.read(ArrowPythonRunner.scala:162) 在 org.apache.spark.sql.execution.python.ArrowPythonRunner$$anon$1.read(ArrowPythonRunner.scala:122) 在 org.apache.spark.api.python.BasePythonRunner$ReaderIterator.hasNext(PythonRunner.scala:410) ...

我在这里缺少什么?我只是按照手册。感谢您的帮助

【问题讨论】:

    标签: python apache-spark pyspark user-defined-functions


    【解决方案1】:

    Pyarrow 于 2019 年 10 月 5 日推出了新版本 0.15,这导致 pandas Udf 抛出错误。 Spark 需要升级才能与此兼容(这可能需要一些时间)。 您可以在这里关注进度https://issues.apache.org/jira/projects/SPARK/issues/SPARK-29367?filter=allissues

    解决方案:

    1. 您需要安装 Pyarrow 0.14.1 或更低版本。 (或)
    2. 从您使用 Python 的位置设置环境变量 ARROW_PRE_0_15_IPC_FORMAT=1

    【讨论】:

    • 感谢您的回答。问题已解决。
    • 这个问题在 pyarrow 的较新版本(如 0.15.1)中是否已修复?
    • 上帝保佑你!花了很多时间来解决这个问题。安装 0.14.0 版解决了它。
    • 这个问题在 pyarrow 的较新版本(如 0.15.1)中是否已修复? - 直到 0.16.0 才修复
    • @SonalDubey 问题不在于pyarrow的新版本,是spark需要升级兼容pyarrow。(恐怕要等spark 3.0才能使用最新的pyarrow)
    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多