当输入中不存在任何文件时,我试图在最近10天内从s3获取最新文件。问题是路径包含日期。
我的路径是这样的:
SECRET_KEY
我正在这样做=
SECRET_KEY
但是我的问题是如何检查月底?我可以在for循环中执行此操作,但是有没有在火花中执行优化和优雅的方式?
答案 0 :(得分:1)
不是很理想,但是如果您想使用Spark,则数据帧读取器可以采用多个路径,而input_file_name
为您提供路径:
val path = "s3://bucket-info/folder1/folder2"
val date = "2019/04/12"
val fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd")
val end = LocalDate.parse(date, fmt)
val prefixes = (0 until 10).map(end.minusDays(_)).map(d => s"$path/${fmt.format(d)}")
val prefix = spark.read
.textFile(prefixes:_*)
.select(input_file_name() as "file")
.distinct()
.orderBy(desc("file"))
.limit(1)
.collect().collectFirst {
case Row(prefix: String) => prefix
}
prefix.fold {
// log error
}
{ path =>
//read and process the file
}
这是非常低效的,没有明确的方法可以解决使用Spark的问题,因为使用递归结构来实现S3 Hadoop文件系统并不是很有效。如果您愿意直接使用S3 API,则可以将s"$path/${fmt.format(end.minusDays(10))}"
设置为start after参数,并使用like this列出密钥。这是因为S3总是返回按字母顺序排序的键列表,并且日期键的填充为零。