Azure Databricks执行MSCK REPAIR TABLE报错:'function'无'name'属性
错误原因及修正方案
核心错误点
- 重复赋值混淆对象类型:你先通过
spark.catalog.listTables(database)得到的是Table对象集合(每个对象有name属性),但随后用spark.sql("show tables in demo")将tables覆盖为DataFrame,后续遍历逻辑混淆了两种对象的属性。 - 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
相关产品推荐
相关产品推荐

