如何在Databricks的PySpark notebook中用正则从文件解析表名
问题根因
withColumn语法错误withColumn方法每次仅支持新增/修改1个列,代码中一次性传入了列名、regexp_extract结果、lit(fi.name)三个参数,语法不合法,这是导致ctSchema无法正常生成的核心原因,该错误会被代码中的try-except捕获吞掉,不会显式抛出中断程序。input_file_name()调用场景错误input_file_name()只有在直接读取文件生成的DataFrame中调用才能返回对应的文件路径,此处是把dataFile.dtypes(本地的列名、类型列表)转成了新的DataFrame,这个DataFrame和原parquet文件没有读取关联,调用input_file_name()会返回空字符串,正则提取自然得不到结果。- 初始化ci的语法错误
初始化ci时传入的测试数据写了三个连续双引号("","","""),存在语法错误,如果ciSchema是3个字段的话,这里需要填写三个合法的空值占位。 - 列匹配问题
union要求两个DataFrame的字段顺序、字段类型完全一致,需要确认ciSchema和添加了TableName列后的tSchema字段完全匹配。
修复后代码
# 需先确认ciSchema和tSchema的字段顺序为:列名、列类型、TableName,确保合并时匹配 import re ci = spark.createDataFrame(data=[("", "", "")], schema=ciSchema) files = dbutils.fs.ls('替换为你的文件路径') results = {} is_error = False for fi in files: try: # 直接对文件名做正则提取,更稳定可靠 match_res = re.search(r"([a-zA-Z0-9]+_[a-zA-Z0-9]+)_shard_\d+_of_\d+\.parquet", fi.name) table_name = match_res.group(1) if match_res else "" dataFile = spark.read.parquet(fi.path) # 生成schema DataFrame,新增TableName列 ctSchema = spark.createDataFrame(data = dataFile.dtypes, schema = tSchema)\ .withColumn("TableName", lit(table_name)) # 用unionByName替代union,避免字段顺序不一致导致的数据错位 ci = ci.unionByName(ctSchema) except Exception as e: results[fi.name] = f"Error: {e}" is_error = True
补充说明
- 直接对文件对象
fi的name属性做正则提取,比在DataFrame中调用input_file_name()更稳定,不会受到DataFrame转换的影响 - 排查问题时可以先注释try-except代码块,让异常直接抛出,就能快速定位具体报错点
内容的提问来源于stack exchange,提问作者Rchee
相关产品推荐
相关产品推荐

