【问题标题】:How to read specific lines from sparkContext如何从 sparkContext 读取特定行
【发布时间】:2016-02-05 09:53:49
【问题描述】:

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

【问题讨论】:

    标签: java text apache-spark line


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 如果您使用 DataFrames 走实走路线,我认为您需要 lines.take(n).apply(n-1)
    • 谢谢,我以某种方式解决了这个问题。假设“nth”是从零开始的:)。 lines 应该是 JavaRDD,所以 take 返回 Java List&lt;String&gt;,因此 get 而不是 apply
    【解决方案2】:

    我认为这是最快的速度

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-21
        • 1970-01-01
        相关资源
        最近更新 更多