【发布时间】: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