2016-02-11 50 views
1

当使用sqlContext.load获取多个文本文件时,如何让Spark将每个文件分割到多个分区中?这对于gzip文件不存在问题,我希望它对常规文本文件的作用相同。如何让Spark不会分裂文本文件

sc.wholeTextFile会工作,除非阅读整个100MB文件需要3G的内存,所以我宁愿使用某种类型的流,因为我们有时需要读取更大的文件。

+1

的StreamingContext具有创建从文件DSTREAM FILESTREAM:然后你就可以通过类似它在sc.textFile执行方式的代码加载文件。这可以帮助 – aasthetic

回答

3

可拆分性是您的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) 
+0

将类定义添加到您的答案。它效果很好。谢谢! –