将文件名哈希附加到Spark RDD的每一行

328d95

我正在尝试将文件目录加载到Spark RDD中,并且需要为每行附加原始文件名。

我无法找到一种使用sc.textFile进行常规RDD操作的方法,因此我现在尝试使用WholeTextFiles方法来加载每个文件的文件名。

我正在使用此代码:

val lines = 
     sc.wholeTextFiles(logDir).flatMap{ case (filename, content) =>
         val hash = modFiles.md5(filename)
         content.split("\n")
         .filter(line =>
            <filter conditions>
         .map(line => line+hash)
     }

但是这段代码给了我一个Java堆内存不足的错误,我想它正在尝试一次加载所有文件?

是否有一种不通过使用WholeTextFiles来解决此问题的方法和/或是否有一种不使用WholeTextFiles一次加载所有文件的方法?

328d95

解决方案是使用此页面上的代码:http : //themodernlife.github.io/scala/spark/hadoop/hdfs/2014/09/28/spark-input-filename/

import org.apache.hadoop.io.LongWritable
import org.apache.hadoop.io.Text
import org.apache.hadoop.mapred.{FileSplit, TextInputFormat}
import org.apache.spark.rdd.HadoopRDD

  // Create the text file
  val text = sc.hadoopFile(logDir,
    classOf[TextInputFormat], classOf[LongWritable], classOf[Text], sc.defaultMinPartitions)

  // Cast to a HadoopRDD
  val hadoopRdd = text.asInstanceOf[HadoopRDD[LongWritable, Text]]
  val linesRaw = hadoopRdd.mapPartitionsWithInputSplit { (inputSplit, iterator) ⇒
    // get file name hash - you need to define your own hash function
    val fileHash = hash(inputSplit.asInstanceOf[FileSplit].getPath.toString)
    // input split is in _1 and line is in _2
    iterator.map(splitAndLine => splitAndLine._2+fileHash)
  }

与使用sc.textFile相比,使用此代码可降低约10%的性能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spark Scala:在多个RDD之间分割每一行

如何为rdd的每一行生成一个哈希?(PYSPARK)

合并csv文件,将原始文件名添加到输出文件中的每一行

附加文件中的每一行

将日期时间附加到6亿行文件中的每一行的末尾

Unix-如何将文本附加到文件的每一行(标题行/第一行除外)

如何将增量计数附加到文本文件的每一行?

将字符串附加到python中.txt文件的每一行吗?

将文本文件中的报价附加到每一行

将文本(字符串值)附加到 txt 文件的每一行

将每一行除以上一行

将每一行除以前一行

比较文件中的每一行

读取 XML 文件的每一行

将每一行读入数组

Perl:将文件的每一行与该文件的每一行进行比较

如何使用TransferSpreadsheet将源文件的文件名添加到每一行的第一单元格?

使用Awk将file1的每一行保存到新文件中,文件名来自file2的每一行

将file_name部分附加到文件的每一行,递归地添加到多个文件

循环,将文件名添加到制表符分隔文件中的每一行的开头(从而生成新列)

R将新行追加到每一行

批处理文件 - 将文件名添加到 txt 的第一行

删除文件中每一行的空格,直到每一行的末尾

MySQL将每一行连接到除自身之外的每一行

Einsum 将每一行乘以每一行

将文件的每一行乘以减一

一种将模式之前的每一行的开头附加到每行末尾的方法?

从每一行的每个文件路径中提取文件名,并在其旁边添加

在文本文件的每一行开头写入脚本的文件名