Модульное тестирование, существует ли файл в локальной файловой системе через Spark

#amazon-web-services #apache-spark #amazon-s3 #apache-spark-sql #hdfs

#amazon-web-services #apache-spark #amazon-s3 #apache-spark-sql #hdfs

Вопрос:

Я могу успешно протестировать приведенный ниже код в кластере EMR через spark. Но я не могу написать модульный тестовый пример с локальной файловой системой в IntelliJ. Кто-нибудь, пожалуйста, может мне помочь с тем, как указать локальную файловую систему в IntelliJ в приведенном ниже коде.

Работа в кластере EMR

 FileSystem.get(new URI("s3n://bucket"), sc.hadoopConfiguration).exists(new Path("/path_to_check"))
  

Не работает в IntelliJ. Он всегда возвращает false

 FileSystem.get(new URI("file://somelocal/bucket"), sc.hadoopConfiguration).exists(new Path("/some/local/path_to_check"))
  

Ответ №1:

Вы можете использовать org.apache.hadoop.fs.FileSystem

 def isFileExists(path: String, pattern: String)(implicit spark: SparkSession): Boolean = {
    val fixedPath = path.stripSuffix("/")   "/"
    val conf = spark.sparkContext.hadoopConfiguration
    val fs = FileSystem.get(new URI(path), conf)
    val reg = new Regex(pattern)

    try {
      val files = fs.listFiles(new Path(fixedPath), true)
      var flag = false
      // hack because listFiles returns RemoteIterator which not an inheritor of java.util.Iterator
      while (files.hasNext) {
        reg.findFirstMatchIn(files.next().toString) match {
          case Some(_) => flag = true
          case None =>
        }
      }
      flag
    } catch {
      // if dir doesn't exist
      case _: java.io.FileNotFoundException => false
      case e: Throwable => throw e
    } finally {
      fs.close()
    }
  }
  

он работает с s3, hdfs и локальной файловой системой, и вы можете писать модульные тесты