You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Databricks执行MSCK REPAIR TABLE报错:'function'无'name'属性

错误原因及修正方案

核心错误点

  1. 重复赋值混淆对象类型:你先通过spark.catalog.listTables(database)得到的是Table对象集合(每个对象有name属性),但随后用spark.sql("show tables in demo")将tables覆盖为DataFrame,后续遍历逻辑混淆了两种对象的属性。
  2. DataFrame遍历方式错误:直接遍历DataFrame(for table in tables)时,迭代的是DataFrame的列名(字符串),而非行对象,因此table.name会抛出AttributeError——字符串没有name属性。

修正方案

方案一:使用spark.catalog.listTables(更简洁高效)

database = "demo"
# 定义要排除的表集合
exclude_tables = {"example1", "example2", "example3", "example4"}

# 过滤出需要修复的表(Table对象集合)
target_tables = [table for table in spark.catalog.listTables(database) if table.name not in exclude_tables]

# 遍历执行修复命令
for table in target_tables:
    spark.sql(f"MSCK REPAIR TABLE {database}.{table.name}")

方案二:基于spark.sql的DataFrame处理方式

如果坚持用show tables获取表列表,需遍历DataFrame的行对象(Row),提取tableName字段:

database = "demo"
exclude_tables = {"example1", "example2", "example3", "example4"}

# 获取过滤后的表列表DataFrame
tables_df = spark.sql("show tables in demo").filter(~spark.sql("show tables in demo").tableName.isin(exclude_tables))

# 方式1:拉取到驱动节点遍历(适合表数量少的场景)
for row in tables_df.collect():
    table_name = row.tableName
    spark.sql(f"MSCK REPAIR TABLE {database}.{table_name}")

# 方式2:分布式遍历(适合大量表的场景)
def repair_table(row):
    spark.sql(f"MSCK REPAIR TABLE {database}.{row.tableName}")

tables_df.foreach(repair_table)

内容的提问来源于stack exchange,提问作者kryprojon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:31:45