繁体   English   中英

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

[英]How to get files name with spark sc.textFile?

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

val data = sc.textFile("/mySource/dir1/*")

现在我的data rdd 包含目录中所有文件的所有行(对吗?)

我现在想用源文件名向每一行添加一列,我该怎么做?

我尝试的其他选项是使用 wholeTextFile 但我一直摆脱 memory 异常。 5台服务器24核24 GB(executor-core 5 executor-memory 5G)有什么想法吗?

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

它从inputSplit获取文件名,并使用iterator使用mapPartitionsWithInputSplitNewHadoopRDD将其添加到每一行

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)

我认为现在回答这个问题已经很晚了,但我找到了一种简单的方法来做你正在寻找的事情:

  • 第 0 步: from pyspark.sql import functions as F
  • 第 1 步:像往常一样使用 RDD 创建 DataFrame。 假设 df
  • 第 2 步:使用input_file_name()
df.withColumn("INPUT_FILE", F.input_file_name())

这将使用源文件名向您的DataFrame添加一列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM