读取目录下的多个 csv 文件时创建单个架构数据帧

Create a single schema dataframe when reading multiple csv files under a directory

提问人:SaadK 提问时间:6/24/2019 最后编辑:SaadK 更新时间:4/28/2021 访问量:1440

问:

我有数以千计的 CSV 文件,这些文件在单个目录下具有相似但不相同的标头。结构如下:

路径/到/文件/unique_parent_directory/*.csv

一个 csv 文件可以是:

|Column_A|Column_B|Column_C|Column_D|
|V1 (英语) |V2 版本 |V3 版本 |V4 版本 |

第二个 CSV 文件可以是:

|Coulmn_A|Coulmn_B|Coulmn_E|Coulmn_F|
|V5系列 |V6系列 |V7系列 |V8 系列 |

我想创建的结果是单个 Spark Dataframe,它可以正确合并文件而不会重叠列,上一个示例的输出应如下所示:

|Column_A|Column_B|Column_C|Column_D|Coulmn_E|Coulmn_F|
|V1 (英语) |V2 版本 |V3 版本 |V4 版本 |空 |空 |
|V5系列 |V6系列 |空 |空 |V7系列 |V8 系列 |

我用于创建数据帧的代码是:

val df = sparkSession.read
          .format("csv")
          .option("header", "true")
          .option("inferSchema", "true")
          .option("mergeSchema", "true")
          .load(path/to/files/unique_parent_directory/*.csv)
          .persist(StorageLevel.MEMORY_AND_DISK_SER)

但我得到以下结果:

|Column_A|Column_B|Column_C|Column_D|
|V1 (英语) |V2 版本 |V3 版本 |V4 版本 |
|V5系列 |V6系列 |V7系列 |V8 系列 |

有没有办法在不运行标头统一过程的情况下获得所需的数据帧?

scala csv io apache-spark-sql

评论

1赞 Aaron 6/25/2019
您必须创建带有标头的所有文件的超级架构。一旦你读取了你的文件,就把所有的东西都合并到一个DF中。据我所知,没有其他方法。
0赞 WillD 6/25/2019
@Aaron似乎走上了正轨。在读取/加载文件类型之前,您能否区分文件类型?
0赞 SaadK 6/25/2019
@Aaron 每次运行进程时逐个读取文件并提取标头会降低集群的性能。
0赞 SaadK 6/25/2019
@WillD所有文件都是 CSV 文件。
0赞 Aaron 6/25/2019
@SaadK每次文件的架构都相同?如果是这样,请创建一个一次性超级架构,并使用该架构读取单个文件。然后进行联合,因为所有 DF 都将具有相同的列名。它不应该那么密集。如果每次运行的架构都是动态的,恐怕没有其他方法了

答: 暂无答案