我根据日志文件创建的日期将日志文件放到不同的目录中。
例如
> /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)
我很新兴,如果我在任何一步都错了,请纠正我。
答案 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))
另一个解决方案是用年,月,日增加数据帧(添加其他列)并在新数据帧上执行所有业务逻辑