使用 pyspark 创建 Spark 数据帧时出现 Py4J 错误



我已经用python 3.6安装了pyspark,我正在使用jupyter notebook来初始化一个spark会话。

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("test").enableHieSupport.getOrCreate()

运行没有任何错误

但我写道,

df = spark.range(10)
df.show()

它抛给我一个错误 ->

Py4JError: An error occurred while calling o54.showString. Trace:
py4j.Py4JException: Method showString([class java.lang.Integer, class java.lang.Integer, class java.lang.Boolean]) does not exist
at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:318)
at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:326)
at py4j.Gateway.invoke(Gateway.java:272)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.GatewayConnection.run(GatewayConnection.java:214)
at java.lang.Thread.run(Thread.java:745)

我不知道为什么我面临这个问题。

如果我这样做,

from pyspark import SparkContext
sc = SparkContext()
print(sc.version)
'2.1.0'

我现在很高兴,因为我的 pyspark 遇到了完全相同的问题,我找到了"解决方案"。就我而言,我在 Windows 10 上运行。通过谷歌进行了多次搜索后,我找到了设置所需环境变量的正确方法:PYTHONPATH=$SPARK_HOME$python;$SPARK_HOME$pythonlibpy4j-<version>-src.zipPy4J 源包的版本在 Spark 版本之间发生变化,因此,请检查 Spark 中的内容并相应地更改占位符。 有关该过程的完整参考,请查看此站点:如何在本地安装 Spark

对我来说

import findspark
findspark.init()
import pyspark

解决了问题

如果您在 anancoda 中使用 pyspark,请在运行代码之前添加以下代码以设置SPARK_HOME:

import os
import sys
spark_path = r"spark-2.3.2-bin-hadoop2.7" # spark installed folder
os.environ['SPARK_HOME'] = spark_path
sys.path.insert(0, spark_path + "/bin")
sys.path.insert(0, spark_path + "/python/pyspark/")
sys.path.insert(0, spark_path + "/python/lib/pyspark.zip")
sys.path.insert(0, spark_path + "/python/lib/py4j-0.10.7-src.zip")

我只需要将SPARK_HOME环境变量设置为火花的位置。我将以下行添加到我的~/.bashrc文件中。

# SPARK_HOME
export SPARK_HOME="/home/pyuser/anaconda3/lib/python3.6/site-packages/pyspark/"

由于我在不同的环境中使用不同版本的 spark,因此我按照本教程(链接)为每个 conda 环境创建环境变量。

我有一个类似的Constructor [...] does not exist问题。然后我发现PySpark包的版本与服务器上安装的Spark(2.4.4) 不同。最后,我通过重新安装相同版本的PySpark解决了这个问题:

pip install pyspark==2.4.4

以下是使用 Jupyter 对我有用的步骤和工具组合:

1) 安装 Java 1.8

2)在Java的PATH中设置环境变量,例如JAVA_HOME = C:Program FilesJavajavasdk_1.8.241

3) 使用 Conda Install 安装 PySpark 2.7(3.0 对我不起作用,它给出错误,要求我匹配 PySpark 和 Spark 版本......搜索 Conda 安装代码 PySpark 2.7

4)安装Spark 2.4(3.0对我不起作用)

5)将环境变量中的SPARK_HOME设置为Spark下载文件夹,例如SPARK_HOME = C:UsersSpark

6)将环境变量中的HADOOP_HOME设置为Spark下载文件夹,例如HADOOP_HOME = C:UsersSpark

7)解压后下载winutils.exe并将其放入Spark软件下载文件夹中的bin文件夹中Spark.tgz

8)在Conda中安装FindSpark,在 Anaconda.org 网站上搜索它并安装在Jupyter笔记本中(这是避免出错的最重要步骤之一)

9) 重新启动计算机以确保应用环境变量

10) 您可以通过在 Windows 命令提示符下键入以下内容来验证是否应用了环境变量:

C:> echo %SPARK_HOME% 

这应该显示您已添加到 Windows 10 高级设置中的 Windows PATH 的环境变量

%env PYTHONPATH=%SPARK_HOME%python;%SPARK_HOME%pythonlibpy4j--src.zip:%PYTHONPATH%
!pip install findspark
import findspark 
!pip install pyspark==2.4.4 
import pyspark 
findspark.init() 
from pyspark import SparkConf, SparkContext
sc = pyspark.SparkContext.getOrCreate()

您必须为 Apache Spark 添加路径并添加必要的库。

尝试更改 pyspark 版本。 为我工作使用的是 3.2.1,切换到 3.2.2 后出现此错误,它工作得很好。

我认为spark.range应该返回一个RDD对象。因此,show不是您可以使用的方法。请改用collecttake

如果要使用show,也可以将spark.range替换为sc.range

import findspark
findspark.init("path of SparkORHadoop ")
from pyspark import SparkContext

你需要首先设置 findspark.init() 然后你可以导入 pyspark

在 Windows 10 中使用 PyCharm 并在 Python 控制台中执行代码时,我遇到了同样的错误,但是,从终端启动 pyspark 时,我能够运行相同的代码而不会出错。在尝试了许多搜索的解决方案后,Pycharm Python 控制台错误的解决方案是以下两篇博客文章中的所有环境变量(我为用户和系统设置了它们)和 PyCharm 设置步骤的组合,在本地设置 pyspark 和 spark & pycharm。

最新更新