在使用Apache Sedona的PySpark应用程序中运行SQL查询时收到“NoSuchMethodError”

vfh0ocws  于 2023-10-23  发布在  Apache
关注(0)|答案(1)|浏览(142)

我正在创建一个PySpark应用程序来执行以下操作:

  • 从CSV文件读取点集合
  • 从CSV文件中读取多边形集合
  • 使用ST_Intersects运行SQL查询以确定它们的重叠位置

我以前在Scala版本中遇到过一个问题,我似乎已经解决了这个问题(Receiving "Scala.MatchError" when running SQL query in a PySpark application with Apache Sedona, possibly caused by incompatible versions),但是当我在一个带有ST_Intersects函数的查询上运行spark.sql(sql).show(5)时,我现在面临一个错误

Py4JJavaError: An error occurred while calling o112.showString.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 8.0 failed 4 times, most recent failure: Lost task 0.3 in stage 8.0 (TID 10) (node5 executor 1): java.lang.NoSuchMethodError: org.apache.commons.text.StringSubstitutor.setEnableUndefinedVariableException(Z)Lorg/apache/commons/text/StringSubstitutor;

经过一些搜索,我验证了Apache Commons Text v1.10确实有一个StringSubstitutor.setEnableUndefinedVariableException方法,我甚至修改了我的设置代码如下:

.config('spark.jars.packages',
                    'org.apache.sedona:sedona-spark-shaded-3.4_2.12:1.5.0,' +
                    'org.datasyslab:geotools-wrapper:1.5.0-28.2,' +
                    'org.apache.commons:commons-text:1.10.0'
                )

不幸的是,我仍然得到同样的错误!

更新1

我已经从我的配置中删除了org.apache.commons:commons-text:1.10.0(因为它并没有真正的帮助)
我试过从$SPARK_HOME/jars文件夹中删除jar文件并将其保存在.config()中,但导致以下错误:

23/10/21 01:42:48 INFO DAGScheduler: ShuffleMapStage 0 (count at NativeMethodAccessorImpl.java:0) failed in 0.143 s due to Job aborted due to stage failure: Task serialization failed: org.apache.spark.SparkException: Failed to register classes with Kryo
org.apache.spark.SparkException: Failed to register classes with Kryo
        at org.apache.spark.serializer.KryoSerializer.$anonfun$newKryo$5(KryoSerializer.scala:185)
...
Caused by: java.lang.ClassNotFoundException: org.apache.sedona.core.serde.SedonaKryoRegistrator
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)

将jar保留在$SPARK_HOME/jars中并删除.config()会导致指向commons文本的相同错误
下面是我的整个配置块:

spark = (
            SparkSession.builder
                .appName("sedona-test-app")
                .config("hive.metastore.uris", "thrift://node1:9083", conf=SparkConf())
                .config("spark.serializer", KryoSerializer.getName)
                .config("spark.kryo.registrator", SedonaKryoRegistrator.getName) 
                .config('spark.jars.packages',
                    'org.apache.sedona:sedona-spark-shaded-3.4_2.12:1.5.0,' +
                    'org.datasyslab:geotools-wrapper:1.5.0-28.2'
                )
                .enableHiveSupport()
                .getOrCreate()
        )

SedonaRegistrator.registerAll(spark)
sc = spark.sparkContext
sc.setSystemProperty("sedona.global.charset", "utf8")

我也试过从Spark 3.5切换到Spark 3.4.1,但没有成功。
我还尝试用不同的命令启动脚本,例如:

python <path to file>.py
spark-submit <path to file>.py
spark-submit --jars $SPARK_HOME/jars/sedona-spark-shaded-3.4_2.12-1.5.0.jar,$SPARK_HOME/jars/geotools-wrapper-1.5.0-28.2.jar <path to file>.py

我也试过使用Anaconda Notebook,但仍然出现同样的错误。

i1icjdpr

i1icjdpr1#

请注意:
如果您已经将sedona-spark-shaded-3.4_2.12-1.5.0.jar放入SPARK_HOME/jars中,则无需在spark.jars.packages配置中再次指定它。
在任何时候,您都可以将jar放入SPARK_HOME/jars中,或者在spark.jars.packages中指定它。
不知道为什么要使用commons-text,如果你想使用Sedona与apache-commons库在一起。请使用spark.jars.packages和使用无阴影的Maven坐标org.apache.sedona:sedona-spark-3.4_2.12:1.5.0

相关问题