Spark作业S3文件跨桶复制并重命名的正则表达式调整
问题描述
我的Spark作业将结果写入S3存储桶后,需要把这些数据复制到另一个S3存储桶并对文件重命名。需要构建合适的正则表达式来实现指定的命名格式:
- 源文件路径示例:
s3://test-bucket/qa/snapshot/processing_time=1385351/id=5721/name=sport/part-e34jt-5a9ghej-fh7r-4710-ghds31o.c000.csv - 期望目标路径:
s3://prod-bucket/results/processing_time=1385351/id=5721/sport.csv
我当前用Scala结合AWS SDK实现路径构建的代码如下,但正则表达式需要调整:
val destBasePath = "s3://prod-bucket/results" val segmentAndNameRx = """s3.*/(\d*/.*csv)""".r fullSourcePath match { case segmentAndNameRx(segmentAndName) => { val path = s"${destBasePath.stripSuffix("/")}/$segmentAndName" Some(path) } case _ => None }
解决方案
要实现这个路径转换,我们需要调整正则表达式,精准捕获processing_time=xxx、id=xxx以及name=后的文件名,然后丢弃原有的part-xxx.csv后缀部分。
下面是优化后的代码,直接通过正则捕获所有必要片段来构建目标路径:
val destBasePath = "s3://prod-bucket/results" // 正则同时捕获processing_time段、id段,以及name=后的文件名 val pathPattern = """s3://.*/(processing_time=\d+)/(id=\d+)/name=([^/]+)/.*\.csv""".r fullSourcePath match { case pathPattern(processingTimeSegment, idSegment, fileName) => { val targetPath = s"${destBasePath.stripSuffix("/")}/$processingTimeSegment/$idSegment/$fileName.csv" Some(targetPath) } case _ => None }
正则表达式说明
s3://.*/:匹配源路径开头的无关前缀(比如示例中的s3://test-bucket/qa/snapshot/)(processing_time=\d+):捕获processing_time=数字这一完整段,保留原格式用于目标路径/(id=\d+)/:捕获id=数字段,同样保留原格式name=([^/]+):捕获name=后面的内容(直到下一个/为止),这就是我们要的文件名主体/.*\.csv:匹配最后一段的随机命名CSV文件(比如示例中的part-e34jt-5a9ghej-fh7r-4710-ghds31o.c000.csv),这部分直接丢弃
这样处理后,就能准确将源路径转换为期望的目标路径,同时兼容相同格式的其他文件路径。
内容的提问来源于stack exchange,提问作者Cassie
相关产品推荐
相关产品推荐

