在 spark/delta 湖中同时更改多列评论

Alter multiple column comments simultaneously in spark/delta lake

简短版: 需要一种faster/better 方式来一次更新spark/databricks 中的许多列评论。我有一个 pyspark 笔记本,它可以在许多 table 中按顺序执行此操作,但是如果我从多个任务中调用它,它们会在配置单元连接上等待很长时间,以至于我会遇到超时故障。

使用的命令:ALTER TABLE my_db_name.my_table_name CHANGE my_column COMMENT "new comment" (docs)

长版:我有一个数据字典笔记本,我在其中维护在多个 table 中重复使用的列描述。如果我直接 运行 笔记本,它会成功地填充我所有的数据库 table 和列注释,方法是对所有 table 的每一列(以及相应的 table 按顺序发出上述命令描述命令一次)。

我正在尝试将其移至 by-table 调用。在填充 tables 的数据块任务中,我检查输出 table 是否存在。如果没有创建它,最后我调用字典笔记本(使用 dbutils.notebook.run("Data Dictionary Creation", 600, {"db": output_db, "update_table": output_table}) 填充特定 table 的评论。如果这同时发生在多个 table 上,但是笔记本会调用现在超时,因为大多数任务花费大量时间 waiting for client connection with hive。即使每个 table.

只调用一次笔记本也是如此

解决方案尝试:

  1. 我尝试了上述命令的多种变体,以便在每个 table 一次调用中更新所有列注释,但这是不可能的,或者我的语法错误。
  2. 我不清楚如何避免超时问题(我已经将超时时间加倍到 10 分钟,但它仍然失败,而原始笔记本在所有 [=44] 上花费的时间比 运行 少得多=]s!)。我需要等待完成才能继续下一个任务(或者我将其作为一个进程生成)。

更新: 我想这里发生的事情是上面的 Alter 命令在一个循环中被调用,当我安排一个作业时,这个循环被分发并并行调用.我可能真正需要的是一种调用它的方法,或者其中的一个函数,而不让循环被分发。有没有办法强制顺序执行单个函数?

如果您想一次更改多个列,为什么不重新创建 table? (此技巧仅在 table 'B' 是外部 table 时有效。这里 table 'B' 是 'B'ad table有过时的评论。Table 'A' 是好的 table 有好的评论。)

  1. 下降 table ('B')
  2. 创建 table 并添加必要的评论 ( 'A' )

如果这个 table 不是外部的,那么您可能想要 create a view,并开始使用它。这将使您能够在不改变原始 tables 数据的情况下添加更新的评论。

您是否考虑过 using table properties 而不是评论?

最后我找到了解决这个问题的方法。

首先,问题似乎是带有 ALTER 命令的循环被 spark 并行化,因此在同一个 table.[= 上同时触发多个(冲突的)命令15=]

对此的回答是 two-fold:

  1. 在我用 ALTER 行调用的函数末尾添加一个 .coalesce(1)。这将函数限制为顺序执行。
  2. Return 来自函数的 newly-created 空数据帧以避免 coalesce-based 错误。

第 2 部分似乎是必要的,因为我认为这个命令是为了返回聚合结果。如果没有它,我找不到让它工作的方法(.repartition(1) 有同样的问题),所以最后我从函数返回 spark.createDataFrame([ (1, "foo")],["id", "label"]) 然后事情就起作用了。

这让我达到了我想要的最终目标,即在没有冲突错误的情况下完成所有更改命令。

虽然笨重得要命;仍然喜欢改进或替代方法,如果有人有的话。