我有一个DLT管道,其中通过从sql服务器读取来创建Delta表,然后调用几个apis来更新宇宙中的元数据。每当我们启动它,它就会在初始化状态中被击中。但是,当我们在一个独立的笔记本中使用交互式集群运行相同的代码时,它工作得很好。有人能帮我理解这个问题吗?
DLT管道在初始化状态下不应被击穿

发布于 2022-11-29 10:34:49
问题是您的DLT程序结构不正确。为DLT编写的程序应该是通过设计声明性的,但在您的示例中,您是在顶层执行操作,而不是在标记为@dlt.table的函数中执行操作。当DLT管道启动时,它通过计算所有代码来构建执行图,并标识用@dlt注释标记的执行图的顶点(您可以看到您的函数被多次调用,正如解释的here)。而且,由于您的代码具有使用spark.read.jdbc读取所有数据、与宇宙交互等副作用,所以初始化步骤非常慢。
为了说明这个问题,让我们看看您的代码结构。现在你有以下几点:
def read(...):
1. Perform read via `spark.read.jdbc` into `df`
2. Perform operations with Cosmos DB
3. Return annotated function that will just return captured `df`因此,项目1和2将在初始化阶段执行,而不是在执行实际管道时执行。
为了缓解这个问题,您需要将结构更改为:
def read(...):
1. Return annotated function that will:
1. Perform read via `spark.read.jdbc` into `df`
2. Perform operations with Cosmos DBhttps://stackoverflow.com/questions/74399160
复制相似问题