【问题标题】:Scala - reading to a DataFrame when a path to the file doesn't existScala - 当文件的路径不存在时读取数据帧
【发布时间】:2019-12-26 16:48:21
【问题描述】:

我正在从 S3 的 json 文件中读取指标数据。当文件的路径不存在时,处理这种情况的正确方法是什么?目前,当没有具有给定 $metricsData 名称的文件时,我得到一个 AnalysisException: Path does not exist

我认为一种方法是抛出异常,但我应该如何正确检查文件路径是否存在?

val metricsDataDF: DataFrame = spark.read.option("multiline", "true")
        .json(s"$dataPath/$metricsData.json")

【问题讨论】:

    标签: scala dataframe apache-spark amazon-s3 apache-spark-sql


    【解决方案1】:

    我不会使用java.nio.file,它没有正确绑定到 S3 和/或 HDFS。如果您希望您的代码适用于所有文件系统(本地、Docker (CI/CD)、S3、HDFS 等),请尝试使用 Apache Hadoop utils:

    import org.apache.hadoop.fs.Path
    import org.apache.hadoop.conf.Configuration
    
    val path = new Path("base/path/to/data")
    val fs = path.getFileSystem(new Configuration())
    
    // applicable for local and remote FS
    if (fs.exists(path)) {
        sparkSession.read(...)
    }
    

    【讨论】:

    • 我们能否确定它一旦部署就可以工作?我的应用程序将在云 (azure) 中的 spark 集群上运行,并访问我公司提供的分布式 fs (adfs)。所有这些都带有很多安全约束。所以,我会测试它,但我可以确信如果 spark 可以读取文件,那么 hadoop.fs.Path 会起作用吗?
    • 是的。 Spark 本身在迭代指定的文件系统和路径(本地、hdfs、s3、azure 等)时使用这些相同的包。
    【解决方案2】:

    你可以使用java.nio.file

    import java.nio.file.{Paths, Files}
    
    if(Files.exists(Paths.get(s"$dataPath/$metricsData.json")))
        val metricsDataDF: DataFrame = spark.read.option("multiline", "true")
            .json(s"$dataPath/$metricsData.json")
    

    How to check if path or file exist in Scala

    【讨论】:

      猜你喜欢
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 2013-02-13
      • 1970-01-01
      • 2013-08-30
      相关资源
      最近更新 更多