Spark:如何获取最近10天内s3的最新文件

时间:2019-05-06 22:09:07

标签: scala file apache-spark hadoop amazon-s3

当输入中不存在任何文件时,我试图在最近10天内从s3获取最新文件。问题是路径包含日期。

我的路径是这样的:

SECRET_KEY

我正在这样做=

SECRET_KEY

但是我的问题是如何检查月底?我可以在for循环中执行此操作,但是有没有在火花中执行优化和优雅的方式?

1 个答案:

答案 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总是返回按字母顺序排序的键列表,并且日期键的填充为零。