Scala 如何使用spark sc.textFile获取文件名?

Scala 如何使用spark sc.textFile获取文件名?,scala,apache-spark,Scala,Apache Spark,我正在使用以下代码读取文件目录: val data = sc.textFile("/mySource/dir1/*") 现在我的datardd包含目录中所有文件的所有行(对吗?) 现在,我想在每一行中添加一列源文件名,如何才能做到这一点 我尝试的其他选项是使用wholeTextFile,但我总是出现内存不足的异常。 5台服务器24核24 GB(executor core 5 executor memory 5G) 有什么想法吗?您可以使用此代码。我已经用Spark 1.4和1.5对它进行了测试

我正在使用以下代码读取文件目录:

val data = sc.textFile("/mySource/dir1/*")
现在我的
data
rdd包含目录中所有文件的所有行(对吗?)

现在,我想在每一行中添加一列源文件名,如何才能做到这一点

我尝试的其他选项是使用wholeTextFile,但我总是出现内存不足的异常。 5台服务器24核24 GB(executor core 5 executor memory 5G)
有什么想法吗?

您可以使用此代码。我已经用Spark 1.4和1.5对它进行了测试

它从
inputSplit
获取文件名,并使用
NewHadoopRDD

import org.apache.hadoop.mapreduce.lib.input.{FileSplit, TextInputFormat}
import org.apache.spark.rdd.{NewHadoopRDD}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.hadoop.io.LongWritable
import org.apache.hadoop.io.Text

val sc = new SparkContext(new SparkConf().setMaster("local"))

val fc = classOf[TextInputFormat]
val kc = classOf[LongWritable]
val vc = classOf[Text]

val path :String = "file:///home/user/test"
val text = sc.newAPIHadoopFile(path, fc ,kc, vc, sc.hadoopConfiguration)

val linesWithFileNames = text.asInstanceOf[NewHadoopRDD[LongWritable, Text]]
           .mapPartitionsWithInputSplit((inputSplit, iterator) => {
  val file = inputSplit.asInstanceOf[FileSplit]
  iterator.map(tup => (file.getPath, tup._2))
  }
)

linesWithFileNames.foreach(println)

如果使用上面的代码段,我认为没有办法获取文件名。但是,您只能通过执行
sc.wholeTextFiles(“/path/to/dir”).keys
来获取文件名。但是我不认为你的错误是由使用wholeTextFile和textFile引起的,它是由你在那之后对数据所做的操作引起的。你应该发布其他代码。我没有其他代码,只有wholeTextFile和count()1。目录中有多少个文件;2.你有没有先在本地机器上试用你的代码。如何在Directories中运行sparkAbout 1222文件在本地是什么意思,这些文件在hdfs上