烫伤从HDFS读取多个文件

时间:2015-02-20 02:30:56

标签: scala hadoop scalding

如何从HDFS上的目录中读取所有文件并使用烫印处理它。对于本地文件系统,我使用下面的

import com.twitter.scalding._
import com.twitter.scalding.JsonLine
import java.io._

class ParseJsonJob(args: Args) extends Job(args) {
  val fileList = new File(args("input")).listFiles
  val fields = ('device_guid
                ,'service_name
                ,'event_type
               )

  fileList.map {
    fileName =>
      JsonLine(fileName.toString, fields)
      .read
      .filter ('service_name) { name: String => name == "myservice" }
      .write(Tsv(args("output") + fileName.toString.split("/").last))
  }
}

这不适用于HDFS。 TextLine或JsonLine是否读取文件以外的目录?

2 个答案:

答案 0 :(得分:0)

您将获得Hadoop文件系统并使用FileSystem.liststatus原语来扫描HDFS目录,例如:

...
val hadoopConf= implicitly[Mode] match {
  case Hdfs(_, conf) => conf
}
val fs= FileSystem.get(hadoopConf)
for(status <- fs.listStatus(new Path(args("input")))) {
  JsonLine(status.getPath.toString.toString, fields)
      .read
      .filter ('service_name) { name: String => name == "myservice" }
      .write(Tsv(args("output") + fileName.toString.split("/").last))
 }

答案 1 :(得分:0)

  

import com.twitter.scalding._
  import com.twitter.scalding.JsonLine   import java.io ._

     

class ParseJsonJob(args:Args)扩展Job(args){        val fields =('device_guid,'service_name,'e​​vent_type)

    JsonLine(args("input"), fields)
    .read
    .filter ('service_name) { name: String => name == "myservice" }
    .write(Tsv(args("output") )   } }

这对你有用。 Lemme知道是不是。