我在 Databricks 上使用 https://databrickslabs.github.io/mosaic/usage/quickstart.html 来做一些 geospatial 转换,到目前为止效果很好。
随着我的代码库开始增长,我正在寻找一种在本地机器上对 geospatial 转换运行单元测试的方法。但是,我无法在本地进行 Mosaic 工作。这是重现我得到的错误的最小示例:
from mosaic import enable_mosaic
from pyspark.sql import SparkSession
spark_session = (
SparkSession.builder.master("local[*]").appName("mylib-tests").getOrCreate()
)
enable_mosaic(spark_session) # <- Error here
这是运行 enable_mosaic(spark_session)
的完整日志,包括我得到的错误:
22/05/18 12:00:23 INFO MosaicLibraryHandler: Looking for Mosaic JAR at /home/nicolas/.pyenv/versions/myenv/lib/python3.9/site-packages/mosaic/lib/mosaic-0.1.1-jar-with-dependencies.jar.
22/05/18 12:00:23 INFO MosaicLibraryHandler: Automatically attaching Mosaic JAR to cluster.
Traceback (most recent call last):
File "/home/nicolas/.pyenv/versions/myenv/lib/python3.9/site-packages/IPython/core/interactiveshell.py", line 3437, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-4-e83e439e0633>", line 1, in <module>
enable_mosaic(spark_session)
File "/home/nicolas/.pyenv/versions/myenv/lib/python3.9/site-packages/mosaic/api/enable.py", line 47, in enable_mosaic
_ = MosaicLibraryHandler(config.mosaic_spark)
File "/home/nicolas/.pyenv/versions/myenv/lib/python3.9/site-packages/mosaic/core/library_handler.py", line 29, in __init__
self.auto_attach()
File "/home/nicolas/.pyenv/versions/myenv/lib/python3.9/site-packages/mosaic/core/library_handler.py", line 76, in auto_attach
ManagedLibraryId.defaultOrganization(),
TypeError: 'JavaPackage' object is not callable
我猜我的本地设置和 Databricks 上的环境有些不同,但我找不到丢失的内容。有没有人设法让 Mosaic 在 Databricks 之外工作?
回答1
我终于设法使它工作。
当我更改 spark 会话的配置时,问题消失了,如下所示:
spark_session = (
SparkSession.builder.master("local[*]")
.config(
"spark.jars",
f"{os.environ['VIRTUAL_ENV']}/lib/python3.9/site-packages/"
"mosaic/lib/mosaic-0.1.1-jar-with-dependencies.jar",
)
.config("spark.databricks.labs.mosaic.jar.autoattach", False)
.appName("mylib-tests")
.getOrCreate()
)
enable_mosaic(spark_session) # works
我希望这可以帮助其他人至少有一些有用的东西,虽然我发现在 python 虚拟环境中引用 jar 文件并不是很干净......如果你有更好的解决方案,请随时离开另一个答案。