Spark 从不同的模式目录读取数据帧

Posted

技术标签:

【中文标题】Spark 从不同的模式目录读取数据帧【英文标题】:Spark Reading data frames from different schema directory 【发布时间】:2017-09-26 13:57:55 【问题描述】:

我的 spark 程序必须从一个目录中读取,这个目录有不同模式的数据

目录/subdir1/文件 1,10,外星人 1,11,鲍勃

目录/subdir2/文件 2,蓝色,123,芝加哥 2,red, 34, 达拉斯

大约 50 个不同架构的目录。

我的 spark 作业必须从所有这些目录中读取数据并生成一个合并这些文件的文件,如下所示

1、10、外星人; 1, 11, 鲍勃; 2、蓝色、123、芝加哥; 2、red、34、达拉斯;

Spark 数据框要求所有目录中的架构都相同。有什么方法可以读取所有这些不同架构的文件并使用 spark 合并到单个文件中

【问题讨论】:

数据的格式是什么?如果是 parquet,您可以使用 spark parquet 模式合并。 它们是镶木地板文件。但是所有文件都有不同的架构。 【参考方案1】:

对于镶木地板和不同的架构,我知道有 2 种策略

    如果架构兼容,您可以使用 mergeSchema

    spark.read.option("mergeSchema", "true").parquet("Dir/")
    

文档:https://spark.apache.org/docs/latest/sql-programming-guide.html#partition-discovery

    如果列是不兼容的类型,您需要读取单个目录,那么您需要将它们转换为 jsonRDD

    df.toJSON
    

然后联合所有的jsonRDD

   df.toJSON.union(df2.toJSON)

然后转换回镶木地板

   spark.read.json(finalJsonRDD)

【讨论】:

以上是关于Spark 从不同的模式目录读取数据帧的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 spark.read.jdbc 读取不同 Pyspark 数据帧中的多个文件

如何从 BigQuery 读取分区表到 Spark 数据帧(在 PySpark 中)

根据大小(mb/gb)读取 spark 数据帧

是否可以以相同或不同的顺序将具有相同标题或标题子集的多个 csv 文件读取到 spark 数据帧中?

读取 CSV 后具有奇怪值的 Spark 数据帧

Pyspark 数据帧从一个存储桶中读取,并在同一作业中使用不同的 KMS 密钥写入另一个存储桶