Azure Databricks 笔记本管道中的 Py4JJavaError

Py4JJavaError in an Azure Databricks notebook pipeline

我有一个奇怪的问题,当通过 dbutils.notebook.run(我在 Azure Databricks 中工作)从调用者笔记本启动数据块笔记本时。

我注意到一个有趣的事情是,当手动启动内部笔记本时,一切都很顺利。

我也确信至少有一个 运行 即使在完全相同的条件下被外部笔记本调用也是如此。 很可能它从未起作用当从外部调用时,请参阅下面的问题说明。

奇怪的是,当我查看内部笔记本 运行 时,我有一个 pandas 相关异常 (KeyError: "None of [Index(['address'], dtype='object')] are in the [columns]")。但我真的不认为它与我的代码有关,因为如上所述,当内部笔记本直接为 运行 时,代码有效。对于它的帮助,内部笔记本有一些繁重的 pandas 计算。

外部笔记本中的完整可见 java 堆栈是:

Py4JJavaError: An error occurred while calling o1141._run.
: com.databricks.WorkflowException: com.databricks.NotebookExecutionException: FAILED
    at com.databricks.workflow.WorkflowDriver.run(WorkflowDriver.scala:71)
    at com.databricks.dbutils_v1.impl.NotebookUtilsImpl.run(NotebookUtilsImpl.scala:122)
    at com.databricks.dbutils_v1.impl.NotebookUtilsImpl._run(NotebookUtilsImpl.scala:89)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:380)
    at py4j.Gateway.invoke(Gateway.java:295)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:251)
    at java.lang.Thread.run(Thread.java:748)
Caused by: com.databricks.NotebookExecutionException: FAILED
    at com.databricks.workflow.WorkflowDriver.run0(WorkflowDriver.scala:117)
    at com.databricks.workflow.WorkflowDriver.run(WorkflowDriver.scala:66)
    ... 13 more

欢迎任何帮助,谢谢!

感谢 @AlexOtt,我确定了问题的根源。

我想分享的主要内容是仔细检查笔记本之间传递的作业参数(尤其是标准传递参数方式发生的“类型转换” )

在我的具体情况下,我想将一个整数传递给内部笔记本,但在这个过程中它被转换为字符串,之后被错误地考虑了。

在外笔记本中:

# set up the parameter dict
jobs_params = {
    ...
    'max_accounts': 0,  # set to 0 to parse all the accounts sent    
}

# call the inner notebook
dbutils.notebook.run("./01_JSON_Processing", 1800, jobs_params)

在内笔记本中:

arg_list = [
    ...
    'max_accounts',
]

v = dict()

for arg in arg_list:
    dbutils.widgets.text(arg, "", "")
    v[arg] = dbutils.widgets.get(arg)

查看v['max_accounts']的类型,发现在处理过程中已经转换为字符串(进一步计算导致KeyError异常) .

我在调试 inner notebook 时没有发现问题,我只是 copy/pasted inner notebook 中的 job_params 值,但这并没有重现 max_accounts 的转换作为过程中的字符串。