根据spark scala中的文件夹名称重命名和移动S3文件

根据spark scala中的文件夹名称重命名和移动S3文件,scala,apache-spark,amazon-s3,Scala,Apache Spark,Amazon S3,我在s3文件夹中有spark输出,我想将所有s3文件从该输出文件夹移动到另一个位置,但在移动时,我想重命名这些文件 例如,我有S3文件夹中的文件,如下所示 Fundamental.FinancialStatement.FinancialStatementLineItems.Japan.1971-BAL.1.2017-10-18-0439.Full.txt Fundamental.FinancialStatement.FinancialStatementLineItems.Japan.1971-B

我在s3文件夹中有spark输出,我想将所有s3文件从该输出文件夹移动到另一个位置,但在移动时,我想重命名这些文件

例如,我有S3文件夹中的文件,如下所示

Fundamental.FinancialStatement.FinancialStatementLineItems.Japan.1971-BAL.1.2017-10-18-0439.Full.txt
Fundamental.FinancialStatement.FinancialStatementLineItems.Japan.1971-BAL.2.2017-10-18-0439.Full.txt
Fundamental.FinancialStatement.FinancialStatementLineItems.Japan.1971-BAL.3.2017-10-18-0439.Full.txt

现在我想重命名所有文件并将其放入另一个目录,但文件的名称如下所示

Fundamental.FinancialStatement.FinancialStatementLineItems.Japan.1971-BAL.1.2017-10-18-0439.Full.txt
Fundamental.FinancialStatement.FinancialStatementLineItems.Japan.1971-BAL.2.2017-10-18-0439.Full.txt
Fundamental.FinancialStatement.FinancialStatementLineItems.Japan.1971-BAL.3.2017-10-18-0439.Full.txt
此处,basical.financialstatement在所有文件中均为常量
2017-10-18-0439
当前日期时间

这是我到目前为止尝试过的,但无法获取文件夹名称并遍历所有文件

    import org.apache.hadoop.fs._

val src = new Path("s3://trfsmallfffile/Segments/output")
val dest = new Path("s3://trfsmallfffile/Segments/Finaloutput")
val conf = sc.hadoopConfiguration   // assuming sc = spark context
val fs = src.getFileSystem(conf)
//val file = fs.globStatus(new Path("src/DataPartition=Japan/part*.gz"))(0).getPath.getName
//println(file)
val status = fs.listStatus(src)    

status.foreach(filename => {
               val a = filename.getPath.getName.toString()
                println("file name"+a)
                //println(filename)
             })
这给了我以下的输出

    file nameDataPartition=Japan
file nameDataPartition=SelfSourcedPrivate
file nameDataPartition=SelfSourcedPublic
file name_SUCCESS
这将为我提供文件夹详细信息,而不是文件夹中的文件


参考资料取自此处

这在过去对我很有效

import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.hadoop.conf.Configuration 
val path = "s3://<bucket>/<directory>"
val fs = FileSystem.get(new java.net.URI(path), spark.sparkContext.hadoopConfiguration)
fs.listStatus(new Path(path))
import org.apache.hadoop.fs.{FileSystem,Path}
导入org.apache.hadoop.conf.Configuration
val path=“s3://”
val fs=FileSystem.get(新的java.net.URI(路径),spark.sparkContext.hadoopConfiguration)
fs.listStatus(新路径(路径))

列表状态提供了s3目录中的所有文件,因为您在s3中有子目录级别,所以您将获得该目录

/*/* to go in subdir .
试试这个

    import org.apache.hadoop.fs._

val src = new Path("s3://trfsmallfffile/Segments/Output/*/*")
val dest = new Path("s3://trfsmallfffile/Segments/FinalOutput")
val conf = sc.hadoopConfiguration   // assuming sc = spark context
val fs = src.getFileSystem(conf)

val file = fs.globStatus(new Path("s3://trfsmallfffile/Segments/Output/*/*"))


  for (urlStatus <- file) {
    //println("S3 FILE PATH IS ===:" + urlStatus.getPath)
    val partitioName=urlStatus.getPath.toString.split("=")(1).split("\\/")(0).toString
    val finalPrefix="Fundamental.FinancialLineItem.Segments."
    val finalFileName=finalPrefix+partitioName+".txt"
    val dest = new Path("s3://trfsmallfffile/Segments/FinalOutput"+"/"+finalFileName+ " ")
    fs.rename(urlStatus.getPath, dest)
  }
导入org.apache.hadoop.fs_ val src=新路径(“s3://trfsmallffile/Segments/Output/*/*”) val dest=新路径(“s3://trfsmallffile/Segments/FinalOutput”) val conf=sc.hadoop配置//假设sc=spark上下文 val fs=src.getFileSystem(conf) val file=fs.globStatus(新路径(“s3://trfsmallffile/Segments/Output/*/*”)
对于(urlStatus)您是否尝试使用
fs.listFiles
然后将其映射到
map
来重命名每个文件?@philantrovert是的,但提取文件夹名称然后移动我无法执行。请您输入一些我不懂的示例代码。一旦执行
fs.rename(src,dest)
,不会成为所有需要重命名的文件所在的文件夹名。
dest
。如果我遗漏了什么,我深表歉意。我在一个代理后面,看不到图像。@Philantrover我已经更新了mu代码,请看一看Arthav:在堆栈溢出上调试单独的代码行不是可行的开发实践。我建议使用IntelliJ IDEA、scalatest等IDE进行测试,并设置断点。您的代码已被破坏,这是逐步调试将告诉您的情况。不,它不提供文件,只列出文件夹详细信息