读取嵌套目录结构中的文件

时间:2018-10-16 16:25:14

标签: scala apache-spark

我有一个嵌套的目录结构,如下所示:

folder
 │
 folder
 ├── a
 │   ├── b
 │   │   └──c
 │   │      └── d
 │   │          └── e
 │   │              └── 20180603121311
 │   └── f
 │       └── g
 │           └──h
 │              └──i
 │                 └── 20180603121511
 └── b     
     │   
     ├── w
     │   └── x
     │       └── y 
     │           └── z 
     │               └── 20180603121411
     └── l
         └── m 
             └── n 
                 └──o 
                    └── 20180603121411

树结构末尾的日期是文件名。它们是没有扩展名的文本文件。目录中的数据累积到26GB,但是我按日期而不是一次都运行程序。每个文件都很小,以KB为单位。

我的原始程序曾经使用一个date参数,例如:20180603,然后遍历所有目录并为包含该日期的所有路径组成一个数组。然后,我将读取每个文件并使用Spark解析该文件。读取该文件后,我将在其上追加名为datetime的新列,该列将拆分路径并获取该路径中的最后一个元素(即datetime)。然后,我将使用联合将该数据框附加到较大的数据框。

但是,读和写该程序花了很长时间,有些日子。如何调整程序以使其可以读取和写入数据?请注意,当我说很长时间时,是指某些日期需要花费超过一天的时间才能完成(数据花费的时间并不那么长)。

  for (inputPath <- pathBuffer) {
if (!errorHandler.isFileEmpty(inputPath) && !errorHandler.hasIncorrectExtension(inputPath)) {

  val df = parse(inputPath, schema)

    globalDF = globalDF.union(df)
 }
}

  def parse(inputPath: String, schema: StructType): DataFrame = {
    try {
      var df = spark.sqlContext.createDataFrame(spark.sparkContext.emptyRDD[Row], schema)

      df = spark.sqlContext.createDataFrame(spark.sparkContext.textFile(inputPath)
        .map(x => parseSchema.getRow(x)), schema)

      df = df.withColumn("datetime", lit(inputPath.split("/").last))

      df
    }

    catch {
      case ex: Exception =>
        throw ex
    }
  }

pathBuffer是一个ListBuffer,其中包含所收集的包含该日期的所有路径。

0 个答案:

没有答案