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

Databricks读取XML文件无法获取_metadata列问题咨询

问题分析与解决方案

核心原因

Databricks的_metadata列特性仅支持内置数据源(如CSV、Parquet、JSON等),而你使用的com.databricks.spark.xml属于第三方XML连接器,并未实现该内置元数据列功能,因此读取XML时会提示“不存在该列”。

替代解决方案

你可以通过以下两种方式获取XML文件的修改时间:

方案1:使用Databricks内置file_metadata函数(推荐,Runtime 13.3+支持)

先通过input_file_name()获取文件路径,再调用file_metadata()提取元数据:

from pyspark.sql import functions as F

# 读取XML并添加文件路径列
df = spark.read \
    .format('com.databricks.spark.xml') \
    .options(rowTag='TAG2', nullValue='') \
    .load(xmlFile) \
    .withColumn("file_path", F.input_file_name())

# 获取文件元数据并提取修改时间
df_with_metadata = df \
    .withColumn("file_metadata", F.file_metadata(F.col("file_path"))) \
    .select("*", F.col("file_metadata.modificationTime").alias("file_modification_time"))

方案2:自定义UDF通过Hadoop API获取元数据(兼容低版本Runtime)

如果你的Databricks版本低于13.3,可以通过Hadoop文件系统API自定义UDF获取元数据:

from pyspark.sql import functions as F
from pyspark.sql.functions import udf
from pyspark.sql.types import StructType, StructField, LongType, StringType
from org.apache.hadoop.fs import Path
from java.io import IOException

def get_file_metadata(file_path):
    try:
        fs = Path(file_path).getFileSystem(spark.sparkContext._jsc.hadoopConfiguration())
        status = fs.getFileStatus(Path(file_path))
        return {
            "modificationTime": status.getModificationTime(),
            "fileSize": status.getLen(),
            "filePath": file_path
        }
    except IOException:
        return None

# 定义元数据Schema
metadata_schema = StructType([
    StructField("modificationTime", LongType(), nullable=True),
    StructField("fileSize", LongType(), nullable=True),
    StructField("filePath", StringType(), nullable=True)
])

# 注册UDF
get_metadata_udf = udf(get_file_metadata, metadata_schema)

# 读取XML并添加元数据
df = spark.read \
    .format('com.databricks.spark.xml') \
    .options(rowTag='TAG2', nullValue='') \
    .load(xmlFile) \
    .withColumn("file_path", F.input_file_name()) \
    .withColumn("file_metadata", get_metadata_udf(F.col("file_path"))) \
    .select("*", F.col("file_metadata.modificationTime").alias("file_modification_time"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 18:15:08