我正在创建一个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,但仍然出现同样的错误。
1条答案
按热度按时间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