组合Spark中多个目录的日志

时间:2017-02-14 11:18:22

标签: scala apache-spark pyspark pyspark-sql databricks

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

例如

> /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)

我很新兴,如果我在任何一步都错了,请纠正我。

1 个答案:

答案 0 :(得分:1)

如果您坚持使用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))

另一个解决方案是用年,月,日增加数据帧(添加其他列)并在新数据帧上执行所有业务逻辑