Amazon s3 如何使用sc.textFile(";s3n://bucket/*.csv";)将文件名映射到RDD?

Amazon s3 如何使用sc.textFile(";s3n://bucket/*.csv";)将文件名映射到RDD?,amazon-s3,mapping,apache-spark,filenames,rdd,Amazon S3,Mapping,Apache Spark,Filenames,Rdd,请注意,我必须使用sc.text文件,但我会接受任何其他答案 我想做的是简单地将正在处理的文件名添加到RDD。。。。比如: var rdd=sc.textFile(“s3n://bucket/*.csv”).map(line=>filename+,“+line) 非常感谢 EDIT2:EDIT1的解决方案是使用Hadoop2.4或更高版本。然而,我还没有用奴隶来测试它。。。然而,上面提到的一些解决方案仅适用于小数据集。如果你想使用大数据,你必须使用HadoopRDD 编辑:我尝试了以下操作,但无

请注意,我必须使用sc.text文件,但我会接受任何其他答案

我想做的是简单地将正在处理的文件名添加到RDD。。。。比如:

var rdd=sc.textFile(“s3n://bucket/*.csv”).map(line=>filename+,“+line)

非常感谢

EDIT2:EDIT1的解决方案是使用Hadoop2.4或更高版本。然而,我还没有用奴隶来测试它。。。然而,上面提到的一些解决方案仅适用于小数据集。如果你想使用大数据,你必须使用HadoopRDD

编辑:我尝试了以下操作,但无效:

:cp symjar/aws-java-sdk-1.9.29.jar
:cp symjar/aws-java-sdk-flow-build-tools-1.9.29.jar

import com.amazonaws.services.s3.AmazonS3Client
import com.amazonaws.services.s3.model.{S3ObjectSummary, ObjectListing, GetObjectRequest}
import com.amazonaws.auth._


def awsAccessKeyId = "AKEY"
def awsSecretAccessKey = "SKEY"

val hadoopConf = sc.hadoopConfiguration;
hadoopConf.set("fs.s3n.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
hadoopConf.set("fs.s3n.awsAccessKeyId", awsAccessKeyId)
hadoopConf.set("fs.s3n.awsSecretAccessKey", awsSecretAccessKey)

var rdd = sc.wholeTextFiles("s3n://bucket/dir/*.csv").map { case (filename, content) =>  filename }
rdd.count
注意:它连接到S3,这不是问题(因为我已经多次测试过它)

我得到的错误是:

INFO input.FileInputFormat: Total input paths to process : 4
java.io.FileNotFoundException: File does not exist: /RTLM-918/simple/t1-100.csv
    at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:517)
    at org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat$OneFileInfo.<init>(CombineFileInputFormat.java:489)
    at org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat.getMoreSplits(CombineFileInputFormat.java:280)
    at org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat.getSplits(CombineFileInputFormat.java:240)
    at org.apache.spark.rdd.WholeTextFileRDD.getPartitions(NewHadoopRDD.scala:267)
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:219)
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:217)
    at scala.Option.getOrElse(Option.scala:120)
    at org.apache.spark.rdd.RDD.partitions(RDD.scala:217)
    at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:32)
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:219)
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:217)
    at scala.Option.getOrElse(Option.scala:120)
    at org.apache.spark.rdd.RDD.partitions(RDD.scala:217)
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:1511)
    at org.apache.spark.rdd.RDD.collect(RDD.scala:813)
    at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:29)
    at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:34)
    at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:36)
    at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:38)
    at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:40)
    at $iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:42)
    at $iwC$$iwC$$iwC$$iwC.<init>(<console>:44)
    at $iwC$$iwC$$iwC.<init>(<console>:46)
    at $iwC$$iwC.<init>(<console>:48)
    at $iwC.<init>(<console>:50)
    at <init>(<console>:52)
    at .<init>(<console>:56)
    at .<clinit>(<console>)
    at .<init>(<console>:7)
    at .<clinit>(<console>)
    at $print(<console>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:1065)
    at org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1338)
    at org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:840)
    at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:871)
    at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:819)
    at org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:856)
    at org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:901)
    at org.apache.spark.repl.SparkILoop.command(SparkILoop.scala:813)
    at org.apache.spark.repl.SparkILoop.processLine$1(SparkILoop.scala:656)
    at org.apache.spark.repl.SparkILoop.innerLoop$1(SparkILoop.scala:664)
    at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$loop(SparkILoop.scala:669)
    at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply$mcZ$sp(SparkILoop.scala:996)
    at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:944)
    at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:944)
    at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
    at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$process(SparkILoop.scala:944)
    at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:1058)
    at org.apache.spark.repl.Main$.main(Main.scala:31)
    at org.apache.spark.repl.Main.main(Main.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:569)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:166)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:189)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:110)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
INFO input.FileInputFormat:要处理的总输入路径:4
java.io.FileNotFoundException:文件不存在:/RTLM-918/simple/t1-100.csv
位于org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:517)
位于org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat$OneFileInfo。(CombineFileInputFormat.java:489)
位于org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat.getMoreSplits(CombineFileInputFormat.java:280)
位于org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat.getSplits(CombineFileInputFormat.java:240)
位于org.apache.spark.rdd.WholeTextFileRDD.getPartitions(NewHadoopRDD.scala:267)
位于org.apache.spark.rdd.rdd$$anonfun$partitions$2.apply(rdd.scala:219)
位于org.apache.spark.rdd.rdd$$anonfun$partitions$2.apply(rdd.scala:217)
在scala.Option.getOrElse(Option.scala:120)
位于org.apache.spark.rdd.rdd.partitions(rdd.scala:217)
位于org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:32)
位于org.apache.spark.rdd.rdd$$anonfun$partitions$2.apply(rdd.scala:219)
位于org.apache.spark.rdd.rdd$$anonfun$partitions$2.apply(rdd.scala:217)
在scala.Option.getOrElse(Option.scala:120)
位于org.apache.spark.rdd.rdd.partitions(rdd.scala:217)
位于org.apache.spark.SparkContext.runJob(SparkContext.scala:1511)
位于org.apache.spark.rdd.rdd.collect(rdd.scala:813)
在$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC。(:29)
在$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC。(:34)
在$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC。(:36)
在$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC。(:38)
$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC。(:40)
在$iwC$$iwC$$iwC$$iwC$$iwC。(:42)
在$iwC$$iwC$$iwC$$iwC。(:44)
在$iwC$$iwC$$iwC。(:46)
$iwC$$iwC。(:48)
iwC美元。(:50)
在(:52)
在。(:56)
在
在。(:7)
在
$print()
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:1065)
位于org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1338)
在org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:840)
在org.apache.spark.repl.SparkIMain.exploration上(SparkIMain.scala:871)
在org.apache.spark.repl.SparkIMain.exploration上(SparkIMain.scala:819)
在org.apache.spark.repl.SparkILoop.really上解释$1(SparkILoop.scala:856)
位于org.apache.spark.repl.SparkILoop.interpretatingstartingwith(SparkILoop.scala:901)
位于org.apache.spark.repl.SparkILoop.command(SparkILoop.scala:813)
位于org.apache.spark.repl.SparkILoop.processLine$1(SparkILoop.scala:656)
位于org.apache.spark.repl.SparkILoop.innerLoop$1(SparkILoop.scala:664)
位于org.apache.spark.repl.sparkloop.org$apache$spark$repl$sparkloop$$loop(sparkloop.scala:669)
在org.apache.spark.repl.sparkilop$$anonfun$org$apache$spark$repl$sparkilop$$process$1.apply$mcZ$sp(sparkilop.scala:996)
在org.apache.spark.repl.sparkilop$$anonfun$org$apache$spark$repl$sparkilop$$process$1.apply(sparkilop.scala:944)
在org.apache.spark.repl.sparkilop$$anonfun$org$apache$spark$repl$sparkilop$$process$1.apply(sparkilop.scala:944)
位于scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
位于org.apache.spark.repl.sparkloop.org$apache$spark$repl$sparkloop$$process(sparkloop.scala:944)
位于org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:1058)
位于org.apache.spark.repl.Main$.Main(Main.scala:31)
位于org.apache.spark.repl.Main.Main(Main.scala)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:569)
位于org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:166)
位于org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:189)
位于org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:110)
位于org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

只需在映射过程中将其作为变量传递(或设置为对象属性)

sc.textFile(“s3n://bucket/“+fn+.csv”).map(line=>set_文件路径(line,fn))


包含文件名的唯一文本方法是
wholeTextFiles

sc.wholeTextFiles(path).map { case (filename, content) => ... }

如果你正在处理大数据,那么HadoopRDD就是答案。否则,再加上其他建议,它就行不通了

代码:


假设我不知道bucket中的文件是什么,所以我无法定义str(fn)。这就是我对这个问题的意思,也是我加入*.csv的原因。那么我该怎么做?str的定义到底是什么?只需获取目录的内容和appl
val text = sc.hadoopFile("s3n://.../", classOf[TextInputFormat], classOf[LongWritable], classOf[Text])
// Cast to a HadoopRDD
val hadoopRdd = text.asInstanceOf[HadoopRDD[LongWritable, Text]]

val fileAndLine = hadoopRdd.mapPartitionsWithInputSplit { (inputSplit, iterator) ⇒
  val file = inputSplit.asInstanceOf[FileSplit]
  iterator.map { tpl ⇒ (file.getPath, tpl._2) }
}