Dynamic Frame按分区列写入S3时冒号被替换为%3a问题咨询
问题根因
Dynamic Frame写入S3时会默认对分区路径中的特殊字符做URL编码,冒号:属于URL保留字符,因此会被自动转义为%3a,而Athena默认不会对路径做URL解码,因此无法直接匹配到编码后的分区路径,导致查询异常。
解决方案
- 方案1:预处理分区列替换冒号(兼容性最高)
写入前将分区时间列中的冒号替换为下划线、横杠等不需要转义的字符,示例代码如下:
from pyspark.sql.functions import col, regexp_replace # 假设时间分区列名为event_time,将冒号替换为横杠 df = df.withColumn("event_time", regexp_replace(col("event_time"), ":", "-"))
修改后分区路径格式为event_time=2024-05-20 12-00-00,Athena可直接识别。
- 方案2:禁用Dynamic Frame的路径自动编码
如果你使用的是Glue 3.0及以上版本,可以在写入时关闭路径转义开关,写入的分区路径会保留原冒号格式:
glueContext.write_dynamic_frame.from_options( frame = dynamic_frame, connection_type = "s3", connection_options = { "path": "s3://你的存储路径", "partitionKeys": ["event_time"], "pathEscaperEnabled": False # 关闭路径转义 }, format = "parquet" # 替换为你的实际存储格式 )
注意:使用该方案前需确认分区列值中不包含
/等S3路径非法字符,避免出现路径截断错误。
- 方案3:存量已写入数据的修复
如果数据已经写入完成不想重跑,可以在Athena中手动指定分区映射关系,示例语句如下:
ALTER TABLE 你的表名 ADD PARTITION (event_time='2024-05-20 12:00:00') LOCATION 's3://你的存储路径/event_time=2024-05-20 12%3A00%3A00/';
执行后Athena就可以正常查询该分区的数据。
内容的提问来源于stack exchange,提问作者user16362488
相关产品推荐
相关产品推荐

