类型错误:“JavaPackage”对象不可调用(spark._jvm)

Jes*_*ers 5 python java java-package apache-spark geospark

我正在设置GeoSpark Python,在安装所有先决条件后,我正在运行非常基本的代码示例来测试它。

from pyspark.sql import SparkSession
from geo_pyspark.register import GeoSparkRegistrator


spark = SparkSession.builder.\
        getOrCreate()

GeoSparkRegistrator.registerAll(spark)

df = spark.sql("""SELECT st_GeomFromWKT('POINT(6.0 52.0)') as geom""")

df.show()
Run Code Online (Sandbox Code Playgroud)

我尝试使用python3 basic.pyand运行它spark-submit basic.py,两者都给我这个错误:

Traceback (most recent call last):
  File "/home/jessica/Downloads/geo_pyspark/basic.py", line 8, in <module>
    GeoSparkRegistrator.registerAll(spark)
  File "/home/jessica/Downloads/geo_pyspark/geo_pyspark/register/geo_registrator.py", line 22, in registerAll
    cls.register(spark)
  File "/home/jessica/Downloads/geo_pyspark/geo_pyspark/register/geo_registrator.py", line 27, in register
    spark._jvm. \
TypeError: 'JavaPackage' object is not callable
Run Code Online (Sandbox Code Playgroud)

我正在使用 Java 8、Python 3、Apache Spark 2.4,我JAVA_HOME的设置正确,我正在运行 Linux Mint 19。我SPARK_HOME的也设置为:

$ printenv SPARK_HOME
/home/jessica/spark/
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

Dat*_*ver 10

geoSpark 的 Jars 未在您的 Spark 会话中正确注册。有几种方法可以解决这个问题,从有点不方便到非常无缝。例如,如果您在调用 Spark-submit 时指定:

--jars jar1.jar,jar2.jar,jar3.jar

那么问题就会消失,pyspark如果那是你的毒药,你也可以提供类似的命令。

如果像我一样,您真的不想每次启动时都执行此操作(并且.conf()在 Jupyter 中将其设置为令人厌烦),那么您可以进入$SPARK_HOME/conf/spark-defaults.conf并设置:

spark-jars jar1.jar,jar2.jar,jar3.jar

当您创建 Spark 实例时将加载它。如果您之前没有使用过该conf 文件,它将作为spark-defaults.conf.template.

当然,当我说 jar1.jar...我真正的意思是:

/jars/geo_wrapper_2.11-0.3.0.jar,/jars/geospark-1.2.0.jar,/jars/geospark-sql_2.3-1.2.0.jar,/jars/geospark-viz_2.3-1.2.0.jar

但这取决于您从 geo_pyspark 包中获取正确的。

如果您使用 EMR: 您需要将集群配置 json 设置为

[
  {
    "classification":"spark-defaults", 
    "properties":{
      "spark.jars": "/jars/geo_wrapper_2.11-0.3.0.jar,/jars/geospark-1.2.0.jar,/jars/geospark-sql_2.3-1.2.0.jar,/jars/geospark-viz_2.3-1.2.0.jar"
      }, 
    "configurations":[]
  }
]
Run Code Online (Sandbox Code Playgroud)

并让你的罐子作为引导程序的一部分上传。您可以从 Maven 执行此操作,但我只是将它们放在 S3 存储桶上:

#!/bin/bash
sudo mkdir /jars
sudo aws s3 cp s3://geospark-test-ds/bootstrap/geo_wrapper_2.11-0.3.0.jar /jars/
sudo aws s3 cp s3://geospark-test-ds/bootstrap/geospark-1.2.0.jar /jars/
sudo aws s3 cp s3://geospark-test-ds/bootstrap/geospark-sql_2.3-1.2.0.jar /jars/
sudo aws s3 cp s3://geospark-test-ds/bootstrap/geospark-viz_2.3-1.2.0.jar /jars/
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 EMR 笔记本, 您的笔记本顶部需要一个神奇的单元:

%%configure -f
{
"jars": [
        "s3://geospark-test-ds/bootstrap/geo_wrapper_2.11-0.3.0.jar",
        "s3://geospark-test-ds/bootstrap/geospark-1.2.0.jar",
        "s3://geospark-test-ds/bootstrap/geospark-sql_2.3-1.2.0.jar",
        "s3://geospark-test-ds/bootstrap/geospark-viz_2.3-1.2.0.jar"
    ]
}
Run Code Online (Sandbox Code Playgroud)