如何在GlueContext的create_dynamic_frame_from_options中获取类似Athena $path的S3完整路径
获取Glue DynamicFrame中数据的完整S3路径
要在Glue中实现类似Athena $path的功能,获取每条数据对应的完整S3存储路径(包括带随机字母数字的子目录),可以通过以下步骤实现:
1. 配置DynamicFrame的路径收集选项
调用create_dynamic_frame_from_options()时,需要开启两个关键配置:
- 递归遍历子目录:在
connection_options中添加"recurse": True,确保Glue会遍历指定路径下所有层级的子目录(包括那层带随机字母数字的目录)。 - 开启路径字段注入:在
format_options中添加"withPath": True,让每个数据记录自动带上其所在文件的完整S3路径。
代码示例
from awsglue.context import GlueContext from pyspark.context import SparkContext # 初始化Glue上下文 sc = SparkContext() glue_context = GlueContext(sc) # 配置S3连接参数 connection_options = { "paths": ["s3://my_s3_bucket/data/dev-data=2022-10-16/"], "recurse": True } # 配置格式选项(以JSON为例,根据实际数据格式替换) format_options = { "withPath": True } # 创建带路径信息的DynamicFrame dynamic_frame = glue_context.create_dynamic_frame_from_options( connection_type="s3", connection_options=connection_options, format="json", format_options=format_options ) # 转换为Spark DataFrame查看结果 dynamic_frame.toDF().show(truncate=False)
2. 提取目标路径或随机字母数字部分
生成的DynamicFrame中会新增一个名为path的字段,值为类似s3://my_s3_bucket/data/dev-data=2022-10-16/abc123/file.json的完整文件路径。如果需要提取特定部分:
提取带随机字母数字的文件夹路径
使用Spark字符串处理函数截取到目标层级:
from pyspark.sql.functions import regexp_extract df = dynamic_frame.toDF() # 正则匹配提取包含随机字母数字的文件夹路径 df_with_folder_path = df.withColumn( "full_folder_path", regexp_extract(df["path"], r"(s3://my_s3_bucket/data/dev-data=\d{4}-\d{2}-\d{2}/[^/]+)/", 1) ) df_with_folder_path.select("full_folder_path").show(truncate=False)
提取随机字母数字串
通过分割路径字符串获取目标部分:
from pyspark.sql.functions import split, element_at df_with_random_part = df.withColumn( "random_alphanumeric", element_at(split(df["path"], "/"), -2) # 倒数第二个层级为随机字母数字目录 ) df_with_random_part.select("random_alphanumeric").show(truncate=False)
注意事项
- 不同数据格式(如Parquet、CSV)均支持
withPath配置,无需额外修改格式参数。 - 如果指定的S3路径已经精确到随机字母数字目录,可省略
recurse: True,但通常建议保留以兼容动态生成的目录结构。
内容的提问来源于stack exchange,提问作者SKJ
相关产品推荐
相关产品推荐

