【问题标题】:How to read multiple csv or json files from an S3 into a spark jason如何从 S3 读取多个 csv 或 json 文件到 spark jason
【发布时间】:2020-03-13 10:09:27
【问题描述】:

我可以将 s3 buket 中的 csv 文件 myexample.csv 读取到 spark 数据帧中。

df = spark.read.csv(s3n://mybucket/myexample.csv)

但是我如何才能读取存储桶中的所有 csv 文件,例如 myexample1.csv, myexample2.csv, myexample.csv 它们在同一个存储桶 s3://mybucket 到一个数据帧中。

df = spark.read.csv(s3n://mybucket/) ..这行得通吗?

【问题讨论】:

  • 在 StackOverflow 上发布之前您没有尝试过吗?
  • 您应该尝试使用s3a 而不是s3n
  • 仅当所有内部目录具有相同的分区时。 Spark 无法读取不兼容的文件(按目录)。所有文件必须处于同一级别。例如。 s3a://bucket/foo=X/bar=Y/meow_i.csv

标签: dataframe apache-spark amazon-s3 pyspark


【解决方案1】:

如果您想读取多个特定类型的文件(CSV、JSONlines、Parquet 等),使用merge-compatible schema 到单个数据集中,方法如下:

  1. 生成文件列表(或目录,如果文件扩展名是标准的)。

  2. 使用spark.read.format(...).option("mergeSchema", true).load(files: _*)

如果某些模式不兼容合并,但可以转换为通用模式,则应针对具有合并兼容模式的每组文件重复上述操作,然后将生成的数据帧投影到通用模式并合并,例如,类似:

val fileListsAndTransforms: Seq[Seq[String], DataFrame => DataFrame] = ...

fileListsAndTransforms.map { case (files, fn) =>
  spark.read.format(...).option("mergeSchema", true).load(files: _*)
    .transform(fn)
}.reduce(_ unionByName _)

代码示例使用 Scala 编写,但它们同样适用于任何支持 Spark 的语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 2015-12-04
    • 2022-01-13
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多