熊猫标量UDF失败,IllegalArgumentException

时间:2019-10-18 21:26:51

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

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

我试图按照here所述在PySpark脚本中设置标量Pandas UDF。

这是我的代码:

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)   ...

我在这里想念什么?我只是在遵循手册。谢谢您的帮助

1 个答案:

答案 0 :(得分:2)

Pyarrow于10月5日推出了新版本0.15,这导致熊猫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