从当前日期读取文件减去90天的火花

时间:2019-01-18 10:46:02

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

我正在一张一张地读取所有文件,这些文件以YY=18/MM=12/DD=10的形式存储在目录结构中,并且只需要读取current date minus 60 days。每天都会创建文件,并且有一天可能不会创建文件。因此,当天将不会创建文件夹。

我正在读取所有存储在目录结构中为YY/MM/DD的文件。 我正在下面的代码中编写,但无法正常工作。

 var datecalculate = {
 var days = 0
 do{
 val start = DateTime.now

 var start1 = DateTime.now.minusDays(days)
 days = days + 1
 var start2 = start1.toString
 datecalculatenow(start2) }

while (days <= 90) 
}    



def datecalculatenow(start2:String):String={
var YY:String = start2.toString.substring(0,4)

var MM:String = start2.toString.substring(5,7)

var DD:String = start2.toString.substring(8,10)

 var datepath = "YYYY=" + YY +"/MM=" +MM +"/DD=" +DD
 var datepath1 = datepath.toString

 org.apache.spark.sql.SparkSession.read.option("delimiter","|").
 option("header","true").option("inferSchema","true").
 csv("/Table/Files" + datepath1  )
 }

我希望读取当前日期减去60天后的每个文件,该文件的目录结构为YY/MM/DD

2 个答案:

答案 0 :(得分:0)

使用spark sql,您可以在select语句中使用以下内容减去90天;

date_sub(CAST(current_timestamp() as DATE), 90)

答案 1 :(得分:0)

由于可以从path列表生成数据帧,为什么不首先生成path列表。这是从多个路径读取数据的简单明了方法:

val paths = (0 until 90).map(days => {
  val tmpDate = DateTime.now.minusDays(days).toString()
  val year = tmpDate.substring(0,4)
  val month = tmpDate.substring(5,7)
  val opdate = tmpDate.toString.substring(8,10)
  (s"basepath/YY=$year/MM=$month/DD=$opdate")
}).toList

val df = spark.read.
        option("delimiter", "|").
        option("header", "true").
        option("inferSchema","true")
        .csv(paths:_*)

在生成paths时,您可以过滤掉不存在的路径。我使用了一些修改后的代码。我没有在本地设置中进行过测试,但是想法是相同的。希望能对您有所帮助。