在Spark中,我们可以使用textFile将文件加载到行中,并尝试使用这些行进行一些操作,如下所示。
val lines = sc.textFile("xxx")
val counts = lines.filter(line => lines.contains("a")).count()
但是,在我的情况下,我想将文件加载到块中,因为文件和块中的数据将如下所示。块将在文件中用空行分隔。
user: 111
book: 222
comments: like it!
因此,我希望textFile函数或任何其他解决方案可以帮助我用块加载文件,这可以通过以下方式实现。
val blocks = sc.textFile("xxx", 3 line)
以前有人面对这种情况吗?感谢
答案 0 :(得分:2)
我建议你从Hdfs实现自己的文件阅读器功能。查看textFile
函数,它构建在hadoopFile
函数之上,它使用TextInputFormat
:
def textFile(path: String, minPartitions: Int = defaultMinPartitions): RDD[String] = {
assertNotStopped()
hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text],
minPartitions).map(pair => pair._2.toString).setName(path)
}
但是这个TextInputFormat
可以通过hadoop属性进行自定义,如answer中所述。在你的情况下,分隔符可以是:
conf.set("textinputformat.record.delimiter", "\n\n")