我正在尝试复制我之前在 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 警报不起作用,这是因为
iframe
沙箱配置。要启用警报,iframe
中的沙箱属性应具有 allow-modals
。
参见下面的示例; Databricks 故意不允许这样做。
接下来,您可以运行脚本来自定义单元格结果的可见性,如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>
元素。