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
相关产品推荐
相关产品推荐

