scala 复制AWS sdk时重命名S3文件

b5lpy0ml  于 2023-03-30  发布在  Scala
关注(0)|答案(1)|浏览(161)

我的Spark作业将结果写入一个S3 bucket,我需要将此数据复制到另一个S3 bucket并重命名文件。我应该构建什么样的正则表达式才能以所需的格式重命名文件?我复制文件的路径是: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
这是我目前构建路径的方式,但我需要调整这个正则表达式,以便能够重命名文件:

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
}

这里的fullSourcePath是源存储桶中每个文件的路径。上面的例子。我在Scala中使用AWS SDK客户端来实现这个/

rsl1atfo

rsl1atfo1#

您可以用途:

processing_time=(\d+)/id=(\d+)/name=([^/]+)

它只是匹配一些数字和最后一部分([^/]+)直到/。第1组将包含processing_time数字,第2组id数字和第3组name字符。

import scala.util.matching.Regex

val fullSourcePath = "s3://test-bucket/qa/snapshot/processing_time=1385351/id=5721/name=sport/part-e34jt-5a9ghej-fh7r-4710-ghds31o.c000.csv"
val destBasePath = "s3://prod-bucket/results"
val segmentAndNameRx: Regex = """processing_time=(\d+)/id=(\d+)/name=([^/]+)""".r

segmentAndNameRx.findFirstMatchIn(fullSourcePath) match {
  case Some(groups) =>
    val path = s"$destBasePath/processing_time=${groups.group(1)}/id=${groups.group(2)}/name=${groups.group(3)}"
    println(path)
  case None =>
    println("Pattern was not matched.")
}

然后,您可以使用findFirstMatchIn来获取匹配的组并基于它们构造路径。
请注意,只有当顺序总是相同时,这才有效,但在这样的URL中通常是这样的。

相关问题