[英]Running delta lake in python and Debian as standalone spark
[英]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
。即使每个表只有一个笔记本调用也是如此。
解决方案尝试:
更新:我认为这里发生的事情是上面的 Alter 命令被循环调用,当我安排一个作业时,这个循环被并行分发和调用。 我可能真正需要的是一种调用它的方法,或者其中的一个函数,而不让循环被分发。 有没有办法强制顺序执行单个函数?
最后我找到了解决这个问题的方法。
首先,问题似乎是带有ALTER
命令的循环被 spark 并行化,因此在同一个表上同时触发了多个(冲突的)命令。
这个问题的答案有两个:
.coalesce(1)
添加到我使用ALTER
行调用的函数的末尾。 这将函数限制为顺序执行。 第 2 部分似乎是必要的,因为我认为这个命令是为了获取结果以进行聚合。 如果没有它,我找不到让它工作的方法( .repartition(1)
有同样的问题),所以最后我返回spark.createDataFrame([ (1, "foo")],["id", "label"])
从功能和事情开始。
这使我达到了我想要的最终目标,即在没有冲突错误的情况下完成所有修改命令。
虽然它很笨重。 如果有人有的话,仍然喜欢改进或替代方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.