如何在 Azure Databricks Notebooks 中实现单元执行控制和 JavaScript 警报?

问题描述 投票:0回答:1

我正在尝试复制我之前在 Jupyter 笔记本中使用的 Azure Databricks 笔记本中的一些功能,特别是与控制笔记本单元的可见性以及显示 JavaScript 警报和在笔记本中执行单元有关。以下是在 Jupyter 中完美运行但在 Databricks 中不起作用的三个代码片段:

示例1:

from IPython.display import HTML, Javascript, display as IPyDisplay, clear_output

HTML('''
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script>
        function code_toggle(){
            if (code_shown){
                $('div.input').hide('500');
                $('#toggleButton').val('Show Code')
            } 
            else {
                $('div.input').show('500');
                $('#toggleButton').val('Hide Code')
            }
            code_shown = !code_shown
        }

        $(document).ready(function(){
            code_shown=false;
            $('div.input').hide()
        });
    </script>
    <form action="javascript:code_toggle()">
        <input type="submit" id="toggleButton" value="Show Code">
    </form>
''')

示例2:

from IPython.display import display, Javascript

display(Javascript("""
alert('Hello, this is a JavaScript alert!');
"""))

示例3:

display(Javascript('IPython.notebook.execute_cell_range(IPython.notebook.get_selected_index()+1, IPython.notebook.ncells())'))

这些片段有助于切换代码单元的可见性以及在 Jupyter 中显示 JavaScript 警报。但是,当我尝试在 Azure Databricks 中实现类似的功能时,它们不起作用,因为 Databricks 似乎不支持与 Jupyter 相同级别的 JavaScript 和 HTML 集成。

问题: 是否有任何替代方案或方法可以在 Azure Databricks 中实现此类功能?具体来说,我正在寻找一种方法:

控制 Databricks 笔记本中单元格的可见性。 在同一笔记本中按 cell_id 执行单元。 在 Databricks 环境中触发 JavaScript 警报或其他客户端 JavaScript 功能。

任何有关如何在 Azure Databricks 中实现此目标的帮助或指导将不胜感激!

javascript python jupyter-notebook azure-databricks
1个回答
0
投票

首先,JavaScript 警报不起作用,这是因为

iframe
沙箱配置。要启用警报,
iframe
中的沙箱属性应具有
allow-modals

参见下面的示例; Databricks 故意不允许这样做。

enter image description here

接下来,您可以运行脚本来自定义单元格结果的可见性,如D3 可视化中的此示例代码中所述。但在您的情况下,表单提交会重定向到 URL,而不是执行脚本。

要进行切换,您不需要表单标签;只需使用如下输入即可。

displayHTML('''
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script>
        function code_toggle(){
            if (code_shown){
                $('div.input').hide('500');
                $('#toggleButton').val('Show Code')
            } 
            else {
                $('div.input').show('500');
                $('#toggleButton').val('Hide Code')
            }
            code_shown = !code_shown
        }

        $(document).ready(function(){
            code_shown=false;
            $('div.input').hide()
        });
    </script>
    <input type="button" id="toggleButton" onclick="code_toggle()" value="Show code"></input>
''')

接下来,要通过 id 运行单元,您可以通过传递单元 id 来使用

dbutils
。请参阅 this Stack Overflow 解决方案了解更多信息。

在这里,我只是调用笔记本一次;您可以在循环中执行一系列要执行的单元格。

到目前为止,上述解决方案可以解决您的问题,您的第二个和第三个示例只是返回对象而不执行它,仅使用

displayHTML
html 字符串中包含
<script></script>
元素。

© www.soinside.com 2019 - 2024. All rights reserved.