【问题标题】:Spark scala read multiple files from S3 using Seq(paths)Spark scala 使用 Seq(paths) 从 S3 读取多个文件
【发布时间】:2021-04-27 09:35:00
【问题描述】:

我有一个 scala 程序,它使用 DataFrameReader 将 json 文件读入 DataFrame,使用像“s3n://bucket/filepath/*.json”这样的文件模式来指定文件。现在我需要将“.json”和“.json.gz”(gzip)文件读入数据帧。

由于当前方法使用通配符,如下所示:

session.read().json("s3n://bucket/filepath/*.json")

我想同时读取 json 和 json-gzip 文件,但我没有找到通配符模式表达式的文档。我很想编写一个更复杂的通配符,但缺乏通配符文档促使我考虑另一种方法。

阅读Spark的文档,说DataFrameReader有这些相关的方法,

  • json(路径:字符串):数据帧
  • json(paths: String*): DataFrame

这会产生更像这样的代码:

// spark.isInstanceOf[SparkSession]
// val reader: DataFrameReader = spark.read
val df: DataFrame = spark.read.json(path: String)
// or
val df: DataFrame = spark.read.json(paths: String*)

我需要阅读 json 和 json-gzip 文件,但我可能需要阅读其他文件名格式。第二种方法(上面)接受一个 Scala Seq(uence),这意味着我可以提供一个 Seq(uence),我以后可以添加其他文件名通配符。

// session.isInstanceOf[SparkSession]
val s3json: String = "s3n://bucket/filepath/*.json"
val s3gzip: String = "s3n://bucket/filepath/*.json.gz"
val paths: Seq[String] = Seq(s3json, s3gzip)
val df: DataFrame = session.read().json(paths)

请对这种方法发表评论,这是理想的吗?

我还看到了在路径序列中添加了 splat 运算符 ("_") 的最后一行的示例。有必要吗?你能解释一下“:_”部分的作用吗?

val df: DataFrame = session.read().json(paths: _*)

splat 运算符的使用示例如下:

【问题讨论】:

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


    【解决方案1】:

    进一步补充 blackbishop 的答案,您可以使用 val df = spark.read.json(paths: _*) 从完全独立的存储桶/文件夹中读取文件。

        val paths = Seq("s3n://bucket1/filepath1/","s3n://bucket2/filepath/2")
        val df = spark.read.json(paths: _*)
    
    

    _*Seq 转换为path 函数所需的变量参数。

    【讨论】:

      【解决方案2】:

      您可以在路径中使用大括号扩展来包含 2 个扩展:

      val df = spark.read.json("s3n://bucket/filepath/{*.json,*.json.gz}")
      

      如果你的bucket只包含.json.json.gz文件,你实际上可以读取所有文件:

      val df = spark.read.json("s3n://bucket/filepath/")
      

      【讨论】:

      • 如果您有多个路径并想从所有路径中提取,例如:spark.read.json("s3n://bucket/filepath_a/", "s3n://bucket/filepath_b/", ...)
      猜你喜欢
      • 2015-12-04
      • 1970-01-01
      • 2017-04-25
      • 2019-03-25
      • 1970-01-01
      • 2018-10-18
      • 2017-02-25
      • 2015-08-31
      相关资源
      最近更新 更多