如何阅读sparkContext

时间:2016-02-05 09:53:49

标签: java text apache-spark line

您好我正在尝试使用spark从文本文件中读取特定行。

SparkConf conf = new SparkConf().setAppName(appName).setMaster(master);
sc = new JavaSparkContext(conf);
JavaRDD<String> lines = sc.textFile("data.txt");
String firstLine = lines.first();

它可以使用.first()命令获取data.text文档的第一行。如何访问文档的第N行?我需要java解决方案。

3 个答案:

答案 0 :(得分:7)

Apache Spark RDD并不适用于查找。最有效率的#34;获取n行的方式是lines.take(n + 1).get(n)。每次执行此操作时,它都会读取文件的第一行n行。您可以运行lines.cache来避免这种情况,但它仍会以非常低效的方式在网络上移动第一条n行。

如果数据可以放在一台机器上,只需收集一次,然后在本地访问:List<String> local = lines.collect(); local.get(n);

如果数据不适合一台计算机,则需要一个支持高效查找的分布式系统。流行的例子是HBase和Cassandra。

使用Spark可以有效解决问题,但不能通过查找解决问题。如果您在单独的问题中解释较大的问题,您可能会得到类似的解决方案。 (查找在单机应用程序中非常常见,但分布式算法必须以不同的方式思考。)

答案 1 :(得分:2)

我认为这很快就会出现

def getNthLine(n: Long) = 
  lines.zipWithIndex().filter(_._2 == n).first

答案 2 :(得分:1)

就像@Daniel Darabos所说,RDD没有为行查找编制索引,所以另一种方法是给它一个索引:

lines.zipWithIndex.filter(_._2==n).map(_._1).first()

给它一个索引,然后再次使用spark上下文,但是当你的RDD的大小很小时,这个方法是低效和愚蠢的。但是当你的RDD的大小非常大时,将它收集到主服务器会变得效率低下(并且可能存在mem限制),并且这种方法成为更好的选择。