1

我正在使用 databricks-connect 和 VS Code 为 Databricks 开发一些 python 代码。

我想使用 databricks-connect 直接从 VS Code 编写和运行/测试所有内容,以避免处理 Databricks Web IDE。对于基本笔记本,它工作得很好,但我想对多个笔记本做同样的事情并使用导入(例如import config-notebook在另一个笔记本中使用)。

但是,在 VS Code 中import another-notebook工作正常,但在 Databricks 中不起作用。据我所知,Databricks 中的替代方法是%run "another-notebook",但如果我想从 VS Code 运行它,它就不起作用(databricks-connect 不包括笔记本工作流)。

有什么方法可以使笔记本导入既适用于 Databricks 又受 databricks-connect 支持?

非常感谢你的回答 !

4

2 回答 2

1

我找到了一个解决方案,可以完成@Kashyap 提到的部分try ... except

包含%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-20T14:24:19.053 回答
0

如何将一个数据块笔记本导入另一个?

导入笔记本的唯一方法是使用运行命令:

run /Shared/MyNotebook

或相对路径:

%run ./MyNotebook

更多详细信息: https ://docs.azuredatabricks.net/user-guide/notebooks/notebook-workflows.html

我能想到的唯一方法是编写使用importrun取决于运行位置的条件代码。

就像是:

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")

于 2021-10-19T20:42:59.740 回答