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

input_file_name()读取Parquet多分区表返回空字符串如何解决

问题原因分析

该问题和分区数量无关,核心是Glue读取Parquet格式的默认优化逻辑导致:

  • Glue的Parquet读取默认开启了谓词下推、向量化读取优化,该优化会跳过文件路径元数据的读取,所以input_file_name()会返回空值
  • CSV格式读取时默认没有启用这类优化,因此可以正常返回文件路径
解决方案

按优先级选择以下方案即可:

  • 方案1(优先推荐,性能影响最小):创建动态框架时禁用Parquet向量化读取优化,保留文件元数据,修改后代码如下:
    dynamic_frame1= glueContext.create_dynamic_frame.from_catalog(
        database = database_name, 
        table_name = table_name,
        # 新增参数禁用向量化读取
        additional_options = {"mergeSchema": "true", "parquet.enableVectorizedReader": "false"}
    )
    dataframe1 = dynamic_frame1.toDF().withColumn("filename", input_file_name()) 
    dataframe1.createOrReplaceTempView("some_temp")    
    sql = """select filename, * from some_temp """
    paths = spark.sql(sql)
    
  • 方案2:不走Glue动态框架封装,直接用Spark原生API读取表,避免优化过滤元数据:
    # 方式1:直接读S3路径
    dataframe1 = spark.read.parquet("s3://你的Parquet表存储根路径")
    # 方式2:通过Catalog读表
    # dataframe1 = spark.read.table(f"{database_name}.{table_name}")
    dataframe1 = dataframe1.withColumn("filename", input_file_name())
    
  • 方案3(多分区表场景补充):如果是多分区表,先关闭动态分区裁剪再执行读取逻辑:
    先执行配置修改:
    spark.conf.set("spark.sql.optimizer.dynamicPartitionPruning.enabled", "false")
    再运行原有读取代码即可。
验证方法

修改完成后执行以下代码验证路径返回是否正常:
paths.select("filename").show(10, truncate=False)
如果输出s3://开头的完整文件路径,说明修复成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:27:01