繁体   English   中英

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

[英]Alter multiple column comments simultaneously in spark/delta lake

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

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

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

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

解决方案尝试:

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

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

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

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

这个问题的答案有两个:

  1. .coalesce(1)添加到我使用ALTER行调用的函数的末尾。 这将函数限制为顺序执行。
  2. 从函数返回一个新创建的空数据框以避免基于合并的错误。

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

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

虽然它很笨重。 如果有人有的话,仍然喜欢改进或替代方法。

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

  1. 删除表('B')
  2. 创建带有所需注释的表('A')

如果这个表不是外部的,那么你可能想要创建一个视图,然后开始使用它。 这将使您能够在不更改原始表数据的情况下添加更新的注释。

您是否考虑过使用表格属性而不是注释?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM