我正在使用databricks-connect和VS Code为Databricks开发一些python代码。
我想使用databricks-connect直接从VS code中编码和运行/测试所有东西,以避免与Databricks web IDE打交道。对于基本的笔记本,它工作得很好,但我想对多个笔记本做同样的事情,并使用导入(例如,在另一个笔记本中使用import config-notebook )。
然而,在VS代码中,import another-notebook工作得很好,但在数据库中却不起作用。据我所知,Databricks中的替代方案是%run "another-notebook",但如果我想从VS Code中运行它,它就不起作用(databricks-connect不包括notebook工作流)。
有没有办法让notebook导入既能在Databricks中工作,又能被databricks-connect支持?
非常感谢你的回答!
发布于 2021-10-20 14:24:19
我找到了一个解决方案,用try ... except完成了@Kashyap提到的部分。
包含%run命令的笔记本的python文件应该如下所示:
# Databricks notebook source
# MAGIC %run "another-notebook"
# COMMAND ----------
try:
import another-notebook
except ModuleNotFoundError:
print("running on Databricks")
import standard-python-lib
# Some very interesting code# MAGIC %run在Python语言中执行时避免使用SyntaxError,并告诉Databricks这是Python中的一个神奇命令。这样,无论脚本是通过databricks-connect在Python中执行还是在Databricks中执行,都可以正常工作。
发布于 2021-10-19 20:43:00
如How to import one databricks notebook into another?中所述
运行/共享/MyNotebook
或相对路径:
%run./MyNotebook
更多细节:https://docs.azuredatabricks.net/user-guide/notebooks/notebook-workflows.html
我能想到的唯一方法是编写条件代码,根据它运行的位置使用import或run。
类似于:
try:
import another-notebook
print("running in VS Code")
except ImportError:
code = """
%run "another-notebook"
print("running in Databricks")
"""
exec(code)如果您想对环境有更多的了解,也许您可以使用上下文中的一些信息。例如下面的代码
for a in spark.sparkContext.__dict__:
print(a, getattr(spark.sparkContext, a))在我的集群中运行打印:
_accumulatorServer <pyspark.accumulators.AccumulatorServer object at 0x7f678d944cd0>
_batchSize 0
_callsite CallSite(function='__init__', file='/databricks/python_shell/scripts/PythonShellImpl.py', linenum=1569)
_conf <pyspark.conf.SparkConf object at 0x7f678d944c40>
_encryption_enabled False
_javaAccumulator PythonAccumulatorV2(id: 0, name: None, value: [])
_jsc org.apache.spark.api.java.JavaSparkContext@838f1fd
_pickled_broadcast_vars <pyspark.broadcast.BroadcastPickleRegistry object at 0x7f678e699c40>
_python_includes []
_repr_html_ <function apply_spark_ui_patch.<locals>.get_patched_repr_html_.<locals>.patched_repr_html_ at 0x7f678e6a54c0>
_temp_dir /local_disk0/spark-fd8657a8-79a1-4fb0-b6fc-c68763f0fcd5/pyspark-3718c30e-c265-4e68-9a23-b003f4532576
_unbatched_serializer PickleSerializer()
appName Databricks Shell
environment {'PYTHONHASHSEED': '0'}
master spark://10.2.2.8:7077
profiler_collector None
pythonExec /databricks/python/bin/python
pythonVer 3.8
serializer AutoBatchedSerializer(PickleSerializer())
sparkHome /databricks/spark因此,例如,您的条件可能是:
if spark.sparkContext.appName.contains("Databricks"):
code = """
%run "another-notebook"
print("running in Databricks")
"""
exec(code)
else:
import another-notebook
print("running in VS Code")https://stackoverflow.com/questions/69633404
复制相似问题