Pandas 如何在Pyspark中启用apachearrow

Pandas 如何在Pyspark中启用apachearrow,pandas,pyspark,pyarrow,Pandas,Pyspark,Pyarrow,我正在尝试启用ApacheArrow以转换为Pandas。我正在使用: pyspark 2.4.4 pyarrow 0.15.0 熊猫0.25.1 numpy 1.17.2 这是示例代码 spark.conf.set(“spark.sql.execution.arrow.enabled”,“true”) x=pd.系列([1,2,3]) df=spark.createDataFrame(pd.DataFrame(x,columns=[“x”])) 我收到了这个警告信息 c:\users\adm

我正在尝试启用ApacheArrow以转换为Pandas。我正在使用:

pyspark 2.4.4 pyarrow 0.15.0 熊猫0.25.1 numpy 1.17.2

这是示例代码

spark.conf.set(“spark.sql.execution.arrow.enabled”,“true”)
x=pd.系列([1,2,3])
df=spark.createDataFrame(pd.DataFrame(x,columns=[“x”]))
我收到了这个警告信息

c:\users\administrator\appdata\local\programs\python\37\lib\site packages\pyspark\sql\session.py:714:UserWarning:createDataFrame试图进行箭头优化,因为'spark.sql.execution.Arrow.enabled'设置为true;但是,由于以下原因导致失败:
调用z:org.apache.spark.sql.api.PythonSQLUtils.readArrowStreamFromFile时出错。
:java.lang.IllegalArgumentException
位于java.nio.ByteBuffer.allocate(ByteBuffer.java:334)
位于org.apache.arrow.vector.ipc.message.MessageSerializer.readMessage(MessageSerializer.java:543)
位于org.apache.spark.sql.execution.arrow.arrowcorters$$anon$3.readNextBatch(arrowcorters.scala:243)
位于org.apache.spark.sql.execution.arrow.ArrowConverters$$anon$3。(ArrowConverters.scala:229)
位于org.apache.spark.sql.execution.arrow.ArrowConverters$.getBatchesFromStream(ArrowConverters.scala:228)
位于org.apache.spark.sql.execution.arrow.ArrowConverters$$anonfun$readArrowStreamFromFile$2.apply(ArrowConverters.scala:216)
位于org.apache.spark.sql.execution.arrow.ArrowConverters$$anonfun$readArrowStreamFromFile$2.apply(ArrowConverters.scala:214)
位于org.apache.spark.util.Utils$.tryWithResource(Utils.scala:2543)
位于org.apache.spark.sql.execution.arrow.ArrowConverters$.readArrowStreamFromFile(ArrowConverters.scala:214)
位于org.apache.spark.sql.api.python.PythonSQLUtils$.readArrowStreamFromFile(PythonSQLUtils.scala:46)
位于org.apache.spark.sql.api.python.PythonSQLUtils.readArrowStreamFromFile(PythonSQLUtils.scala)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
位于py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
在py4j.Gateway.invoke处(Gateway.java:282)
位于py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
在py4j.commands.CallCommand.execute(CallCommand.java:79)
在py4j.GatewayConnection.run处(GatewayConnection.java:238)
运行(Thread.java:748)
正在尝试将“spark.sql.execution.arrow.fallback.enabled”设置为true的非优化。
警告。警告(msg)

我们在0.15.0中做了一个更改,使pyarrow的默认行为与Java中较旧版本的Arrow不兼容——您的Spark环境似乎使用了较旧版本

你的选择是

  • 从使用Python的位置设置环境变量
    ARROW\u PRE\u 0\u 15\u IPC\u FORMAT=1
  • 暂时降级到pyarrow<0.15.0
      用于在Spark 2.4.4集群中使用
      pyarrow==0.15
      调用my pandas UDF。如上所述,我很难成功地设置
      ARROW\u PRE\u 0\u 15\u IPC\u FORMAT=1
      标志

      我通过头部节点上的
      export
      在(1)命令行中设置标志,(2)通过集群中所有节点上的
      spark env.sh
      warn env.sh
      ,以及(3)通过头部节点上的脚本在pyspark代码本身中设置标志。由于未知的原因,所有这些都无法在udf内部实际设置此标志

      我找到的最简单的解决方案是在udf中称之为

          @pandas_udf("integer", PandasUDFType.SCALAR)
          def foo(*args):
              import os
              os.environ["ARROW_PRE_0_15_IPC_FORMAT"] = "1"
              #...
      

      希望这能为其他人节省几个小时。

      哇,这已经困扰了我好几天了!我有一个非常简单的groupBy.apply语句和一个PandasUDF方法,它总是在以前没有的地方失败。事实证明构建环境已经开始使用0.15>这就是答案。请在下面打勾:)谢谢@Wes mckinney这个答案仍然有效吗?可能是重复的谢谢!其他解决方案对我们不起作用,但这确实起了作用。AWS EMR 2.4.x,所以在EMR上的配置设置可能不像在其他spark解决方案上那么容易。这节省了我几个小时。出于某种原因,我的开发端点有pyarrow 0.13.0,它工作得很好,而AWS Glue集群有0.16.0,它失败了。这个解决方案是一个很好的解决方案,直到我们正确地修复它。