我有一个嵌套的目录结构,如下所示:
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,其中包含所收集的包含该日期的所有路径。