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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:02:54