2016-02-11 2 views
1

При использовании sqlContext.load для нескольких текстовых файлов, как вы держите Spark от разбиения каждого файла на несколько разделов? Это не проблема с файлами gzip'd, я бы хотел, чтобы он работал одинаково для обычных текстовых файлов.Как сохранить Spark от разделения текстовых файлов

:

sc.wholeTextFile будет работать, кроме чтения всего 100 МБ файла, так или иначе требующего 3G памяти, поэтому я предпочел бы использовать какую-то потоковое вещание, поскольку нам иногда нужно было бы читать гораздо большие файлы.

+1

StreamingContext имеет FileStream для создания DStream из файлов. Это может помочь – aasthetic

ответ

3

Разделимость - это особенность вашего InputFormat. TextInputFormat имеет условную разделяемость в зависимости от источника (обычный текст, некоторые сжатые тексты могут быть разделены, но gzip принципиально не расщепляется).

Чтобы получить нужное поведение, вы можете просто увеличить TextInputFormat как свой собственный NonSplittingTextInputFormat и переопределить метод isSplittable, чтобы всегда возвращать false. Затем вы можете загрузить файлы с помощью кода аналогично тому, как это реализовано в sc.textFile:

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

Добавил определение класса в ваш ответ. Он отлично работает. Благодаря! –

Смежные вопросы