当使用sqlContext.load
获取多个文本文件时,如何让Spark将每个文件分割到多个分区中?这对于gzip文件不存在问题,我希望它对常规文本文件的作用相同。如何让Spark不会分裂文本文件
sc.wholeTextFile
会工作,除非阅读整个100MB文件需要3G的内存,所以我宁愿使用某种类型的流,因为我们有时需要读取更大的文件。
当使用sqlContext.load
获取多个文本文件时,如何让Spark将每个文件分割到多个分区中?这对于gzip文件不存在问题,我希望它对常规文本文件的作用相同。如何让Spark不会分裂文本文件
sc.wholeTextFile
会工作,除非阅读整个100MB文件需要3G的内存,所以我宁愿使用某种类型的流,因为我们有时需要读取更大的文件。
可拆分性是您的InputFormat的一项功能。 TextInputFormat根据来源具有条件可拆分性(纯文本,某些压缩文本可以拆分,但gzip基本上不可拆分)。
要获得您想要的行为,只需将TextInputFormat
作为您自己的NonSplittingTextInputFormat
并重写isSplittable方法以始终返回false。
import org.apache.hadoop.fs.{FileSystem, Path}
class NonSplittingTextInputFormat extends TextInputFormat {
override protected def isSplitable(context: FileSystem, file: Path): Boolean = false
}
sc.hadoopFile(path, classOf[NonSplittableInputFormat], classOf[LongWritable], classOf[Text],
minPartitions).map(pair => pair._2.toString)
将类定义添加到您的答案。它效果很好。谢谢! –
的StreamingContext具有创建从文件DSTREAM FILESTREAM:然后你就可以通过类似它在sc.textFile执行方式的代码加载文件。这可以帮助 – aasthetic