组合来自 Spark 中多个目录的日志

Combining the logs from multiple directories in Spark

我根据日志文件的创建日期将日志文件放入不同的目录。

例如

> /mypath/2017/01/20/... 
.
.
.
> /mypath/2017/02/13/...
> /mypath/2017/02/14/...

我想使用 pyspark 将所有这些日志文件合并到一个 rdd 中,这样我就可以在这个主文件上进行聚合。

到目前为止,我已经获取了单独的目录,称为 sqlContext 并使用 Union 加入特定日期的所有日志文件。

DF1 = (sqlContext.read.schema(schema).json("/mypath/2017/02/13")).union(sqlContext.read.schema(schema).json("/mypath/2017/02/14"))

是否有通过指定日期范围内的日志文件来获取主 rdd 的简单方法? (即从 2017/01/20 到 2017/02/14)

刚接触spark,如有不妥请指正

如果您坚持使用 sqlContext,那么一个简单的解决方案就是定义一个方法,该方法将列出输入目录中的所有文件

case class FileWithDate(basePath: String, year: Int, month: Int, day: Int) {
 def path = s"${basePath}/${year}/${month}/${day}"
}

def listFileSources() : List[FileWithDate] = ??? // implement here

如果你想合并来自源的所有数据帧,你可以这样做:

// create an empty dataframe with the strucutre for the json
val files = listSources()
val allDFs = files.foldLeft(emptyDF){case (df, f) => df.union(sqlContext.read.schema(schema).json(f.path))}

如果你想按日期过滤输入文件,那就很容易了。像这样

files.filter(_.year == 2016 && (_.month >=2 || _.month <=3))

另一个解决方案是用年、月、日来扩充您的数据框(放置额外的列),并在新数据框上执行所有业务逻辑