您好我正在尝试使用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解决方案。
答案 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限制),并且这种方法成为更好的选择。