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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:48:00