【问题标题】:spark: read multiple textfiles and spill out the first line of each file?spark:读取多个文本文件并溢出每个文件的第一行?
【发布时间】:2015-12-22 11:28:22
【问题描述】:

如何读取多个文件(> 1000 个文件)并说只打印出 spark 中每个文件的第一行?

我正在阅读链接 How to read multiple text files into a single RDD? 其中提到我可以使用以下语法在 spark 中读取多个文件(比如 3 个文件):

val fs = sc.textFile("a.txt,b.txt,c.txt")

fs 似乎将所有文件粘合在一起。

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    一种方法是使用HadoopFileTextInputFormat

    import org.apache.hadoop.mapred.TextInputFormat
    import org.apache.hadoop.io.{LongWritable, Text}
    
    val input: String = ???
    
    val firstLines = sc.hadoopFile(
         input, classOf[TextInputFormat], classOf[LongWritable], classOf[Text])
      .flatMap {
        case (k, v) => if (k.get == 0) Seq(v.toString) else Seq.empty[String]
      }
    

    由于TextInputFormat 的键代表给定行的文件开头的偏移量,因此您应该得到您想要的。

    【讨论】:

    • 零,Spark大师,为什么不用sc.wholeTextFiles()?
    • 马里亚诺,零,我也有同样的问题,对比sc.textFilesc.wholeTextFiles。对不起,我不熟悉sc.hadoopFile API....
    • @MarianoKamp 我的好人,只是为了避免以“如果数据不适合内存怎么办”开头的后续问题 :) 说真的,从我目前看到的 @987654328 @ 通常表现出比TextInputFormat 差得多的性能。如果您在此之上添加可能的内存问题,那么在这里很难证明wholeTextFiles 的合理性。这个解决方案的好处是它不需要根据输入进行任何配置更改。
    • @CarsonPun textFile 不适用,因为它会丢弃所需的信息。你可以使用sc.wholeTextFiles(input).map(_._2.takeWhile(_ != '\n')) 之类的东西,但我不是特别喜欢这个解决方案。
    猜你喜欢
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2016-08-14
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多