如何读取结构相同但列名不同的分区镶木地板?
How to read partitioned parquets with same structure but different column names?
我有按创建日期 (BusinessDate) 和数据源 (SourceSystem) 分区的镶木地板文件。一些源系统使用不同的列名生成它们的数据(小东西,比如大写,即 orderdate
与 OrderDate
),但整体数据结构相同(列顺序和数据类型在文件之间始终相同)。
我的文件系统中的数据如下所示:
dataroot
|-BusinessDate=20170809
|-SourceSystem=StoreA
|-data.parquet (has column "orderdate")
|-SourceSystem=StoreB
|-data.parquet (has column "OrderDate")
有没有办法从 dataroot
或 dataroot/BusinessData=######/
中读取数据,并以某种方式将数据规范化为统一模式?
我的第一次尝试是:
val inputDF = spark.read.parquet(samplePqt)
standardNames = Seq(...) //list of uniform column names in order
val uniformDF = inputDF.toDF(standardNames: _*)
但这不起作用(将重命名在源系统之间具有相同列名的列,但对于来自源系统 B 的具有不同列名的记录,将填充 null
)。
我从来没有找到一次处理所有数据的方法,我的解决方案遍历不同的源系统,创建指向每个源系统的文件路径,并单独处理它们。当它们被单独处理时,它们被转换成一个标准模式并与其他结果合并。
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}
我有按创建日期 (BusinessDate) 和数据源 (SourceSystem) 分区的镶木地板文件。一些源系统使用不同的列名生成它们的数据(小东西,比如大写,即 orderdate
与 OrderDate
),但整体数据结构相同(列顺序和数据类型在文件之间始终相同)。
我的文件系统中的数据如下所示:
dataroot
|-BusinessDate=20170809
|-SourceSystem=StoreA
|-data.parquet (has column "orderdate")
|-SourceSystem=StoreB
|-data.parquet (has column "OrderDate")
有没有办法从 dataroot
或 dataroot/BusinessData=######/
中读取数据,并以某种方式将数据规范化为统一模式?
我的第一次尝试是:
val inputDF = spark.read.parquet(samplePqt)
standardNames = Seq(...) //list of uniform column names in order
val uniformDF = inputDF.toDF(standardNames: _*)
但这不起作用(将重命名在源系统之间具有相同列名的列,但对于来自源系统 B 的具有不同列名的记录,将填充 null
)。
我从来没有找到一次处理所有数据的方法,我的解决方案遍历不同的源系统,创建指向每个源系统的文件路径,并单独处理它们。当它们被单独处理时,它们被转换成一个标准模式并与其他结果合并。
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}