如何读取具有相同结构但不同列名的分区parquets?

时间:2018-03-21 16:28:06

标签: scala apache-spark apache-spark-sql parquet

我有按创建日期(BusinessDate)和数据源(SourceSystem)划分的镶木地板文件。一些源系统使用不同的列名生成数据(大写的小东西,即orderdate vs OrderDate),但相同的整体数据结构(列顺序和数据类型在文件之间始终相同)。

我的数据在我的文件系统中看起来像这样:

dataroot
|-BusinessDate=20170809
  |-SourceSystem=StoreA
    |-data.parquet (has column "orderdate")
  |-SourceSystem=StoreB
    |-data.parquet (has column "OrderDate")

有没有办法从datarootdataroot/BusinessData=######/读取数据,并以某种方式将数据规范化为统一模式?

我的第一次尝试是尝试:

val inputDF = spark.read.parquet(samplePqt)
standardNames = Seq(...) //list of uniform column names in order
val uniformDF = inputDF.toDF(standardNames: _*)

但是这不起作用(将重命名源系统之间具有相同列名的列,但是将填充null来源于具有不同列名的源系统B的记录。)

1 个答案:

答案 0 :(得分:0)

我从未找到过一次处理所有数据的方法,我的解决方案遍历不同的源系统,创建指向每个源系统的文件路径,并单独处理它们。当它们被单独处理时,它们会转换为标准模式并与其他结果联合。

val inputDF = spark.read.parquet(dataroot) //dataroot contains business date
val sourceList = inputDF.select(inputDF("source_system")).distinct.collect.map(_(0)).toList //list of source systems for businessdate
sourceList.foreach(println(_))
for (ss <- sourceList){//process data}