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

