我正在一张一张地读取所有文件,这些文件以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
答案 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
时,您可以过滤掉不存在的路径。我使用了一些修改后的代码。我没有在本地设置中进行过测试,但是想法是相同的。希望能对您有所帮助。