如何从 sparkContext 中读取特定行

How to read specific lines from sparkContext

您好,我正在尝试使用 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 解决方案。

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

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

如果数据不能放在一台机器上,你需要一个支持高效查找的分布式系统。流行的例子是 HBase 和 Cassandra。

您的问题也有可能可以通过 Spark 有效解决,但不能通过查找来解决。如果你在一个单独的问题中解释更大的问题,你可能会得到这样的解决方案。 (查找在单机应用程序中很常见,但分布式算法必须有不同的想法。)

我认为这会很快

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

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

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

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