【问题标题】:How to pass the script path to %run magic command as a variable in databricks notebook?如何将脚本路径作为数据块笔记本中的变量传递给 %run magic 命令?
【发布时间】:2021-10-23 09:52:33
【问题描述】:

我想使用 %run 从另一个笔记本的数据块中运行一个笔记本。此外,我希望能够将正在运行的笔记本的路径作为参数发送到主笔记本。
不使用 dbutils.notebook.run 的原因是我在被调用的笔记本中存储了大量嵌套的字典,我想在主笔记本中使用它们。
比如:

path = "/References/parameterDefinition/schemaRepository"
%run <path variable>

谢谢你:)

【问题讨论】:

    标签: python pyspark jupyter-notebook databricks magic-command


    【解决方案1】:

    您可以传递 Databricks 网站上记录的参数: https://docs.databricks.com/notebooks/widgets.html#use-widgets-with-run

    在顶部的笔记本中你可以调用

    `%run /path/to/notebook` $X="10" $Y="1"
    

    然后在子笔记本中,您可以使用小部件 API 引用这些参数,如

    x_value = dbutils.widgets.get("X")
    y_value = dbutils.widgets.get("Y")
    

    对于您的具体问题,它看起来像这样,其中“路径”是要通过目标笔记本中的小部件 API 引用的变量:

     %run /path/to/notebook $path="/path/to/notebook"
    

    【讨论】:

    • 你不能运行作为变量引用的笔记本,你只能路径笔记本的一个参数...
    【解决方案2】:

    %run%fs 等魔术命令不允许传入变量。

    解决方法是您可以像使用dbutils.notebook.run(notebook, 300 ,{}) 一样使用dbutils

    【讨论】:

    • 不使用 dbutils.notebook.run 的原因是我在被调用的笔记本中存储了大量嵌套的字典,我想在主笔记本中使用它们。
    【解决方案3】:

    不幸的是,不可能将%run 中的路径作为变量传递。您只能将变量作为参数传递,并且只能与小部件结合使用 - 您可以在 this answer 中查看示例。在这种情况下,您可以将所有定义放在一个笔记本中,并根据传递的变量重新定义字典。

    在接下来的几个月中将推出一项新功能(大约,请参阅 public roadmap webinar 了解更多详细信息),允许使用 import 语句将笔记本作为库导入。您可以通过使用Export command of Workspace API 将笔记本导出到磁盘上的文件、解码数据并导入文件的内容来模拟相同的功能,例如,如果您有名为module1 的笔记本,其中包含内容

    my_cool_dict = {"key1": "abc", "key2": 123}
    

    然后你可以按如下方式导入:

    import requests
    import base64
    import os
    
    
    api_url = dbutils.notebook.entry_point.getDbutils().notebook().getContext().apiUrl().get()
    host_token = dbutils.notebook.entry_point.getDbutils().notebook().getContext().apiToken().get()
    
    path = "/Users/..../module1"
    
    # fetch notebook
    response = requests.get(f"{api_url}/api/2.0/workspace/export",
        json = {"format": "SOURCE", "path": path},
        headers={"Authorization": f"Bearer {host_token}"}
      ).json()
    
    # decode base64 encoded content
    data = base64.b64decode(response["content"].encode("ascii"))
    
    # write the file & __init__.py, so directory will considered a module
    dir = os.path.join("/tmp","my_modules")
    if not os.path.exists(dir):
        os.mkdir(dir)
    
    with open(os.path.join(dir, os.path.split(path)[-1]+".py"), "wb") as f:
      f.write(data)
    with open(os.path.join(dir, "__init__.py"), "wb") as f:
      f.write("\n".encode("ascii"))
    
    # add our directory into system path
    import sys
    sys.path.append(dir)
    
    # import notebook
    from module1 import my_cool_dict
    

    并看到我们得到了我们的变量:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-21
      • 2011-01-15
      • 1970-01-01
      • 2018-01-11
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 2012-10-21
      相关资源
      最近更新 更多