首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Pyspark中启用Apache Arrow

如何在Pyspark中启用Apache Arrow
EN

Stack Overflow用户
提问于 2019-10-07 11:58:13
回答 2查看 15.8K关注 0票数 22

我正在尝试使Apache能够转换为Pandas。我正在使用:

熊猫0.25.1矮小1.17.2

这是示例代码

代码语言:javascript
复制
spark.conf.set("spark.sql.execution.arrow.enabled", "true")
x = pd.Series([1, 2, 3])
df = spark.createDataFrame(pd.DataFrame(x, columns=["x"]))

我收到一条警告信息

代码语言:javascript
复制
c:\users\administrator\appdata\local\programs\python\python37\lib\site-packages\pyspark\sql\session.py:714: UserWarning: createDataFrame attempted Arrow optimization because 'spark.sql.execution.arrow.enabled' is set to true; however, failed by the reason below:
  An error occurred while calling z:org.apache.spark.sql.api.python.PythonSQLUtils.readArrowStreamFromFile.
: java.lang.IllegalArgumentException
    at java.nio.ByteBuffer.allocate(ByteBuffer.java:334)
    at org.apache.arrow.vector.ipc.message.MessageSerializer.readMessage(MessageSerializer.java:543)
    at org.apache.spark.sql.execution.arrow.ArrowConverters$$anon$3.readNextBatch(ArrowConverters.scala:243)
    at org.apache.spark.sql.execution.arrow.ArrowConverters$$anon$3.<init>(ArrowConverters.scala:229)
    at org.apache.spark.sql.execution.arrow.ArrowConverters$.getBatchesFromStream(ArrowConverters.scala:228)
    at org.apache.spark.sql.execution.arrow.ArrowConverters$$anonfun$readArrowStreamFromFile$2.apply(ArrowConverters.scala:216)
    at org.apache.spark.sql.execution.arrow.ArrowConverters$$anonfun$readArrowStreamFromFile$2.apply(ArrowConverters.scala:214)
    at org.apache.spark.util.Utils$.tryWithResource(Utils.scala:2543)
    at org.apache.spark.sql.execution.arrow.ArrowConverters$.readArrowStreamFromFile(ArrowConverters.scala:214)
    at org.apache.spark.sql.api.python.PythonSQLUtils$.readArrowStreamFromFile(PythonSQLUtils.scala:46)
    at org.apache.spark.sql.api.python.PythonSQLUtils.readArrowStreamFromFile(PythonSQLUtils.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:282)
    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)

Attempting non-optimization as 'spark.sql.execution.arrow.fallback.enabled' is set to true.
  warnings.warn(msg)
EN

回答 2

Stack Overflow用户

发布于 2019-10-07 16:07:10

我们在0.15.0中做了一个更改,这使得py箭头的默认行为与Java中的Arrow的旧版本不兼容--您的Spark环境似乎使用的是旧版本。

你的选择是

从使用Python

  • Downgrade的位置开始,
  • 将环境变量ARROW_PRE_0_15_IPC_FORMAT=1设置为py箭头< 0.15.0。
票数 51
EN

Stack Overflow用户

发布于 2020-10-01 17:15:00

pyarrow==0.15在我的Spark2.4.4集群中给我的熊猫命名为UDF。正如上面提到的,我很难设置ARROW_PRE_0_15_IPC_FORMAT=1标志。

我在以下位置设置了标志:(1)在头节点上通过export设置命令行;(2)在集群中的所有节点上通过spark-env.shyarn-env.sh设置标志;(3)在我在head节点上的脚本中设置吡火花代码本身。由于未知的原因,所有这些都无法真正在udf中设置此标志。

我找到的最简单的解决方案是将这个中称为udf:

代码语言:javascript
复制
    @pandas_udf("integer", PandasUDFType.SCALAR)
    def foo(*args):
        import os
        os.environ["ARROW_PRE_0_15_IPC_FORMAT"] = "1"
        #...

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

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58269115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档