在Parquet Partitioned Dir结构中读取不同的Schema

时间:2017-03-30 02:33:52

标签: pyspark parquet pyspark-sql

我在使用spark:

编写的hdfs上有以下分区镶木地板数据
year
 |---Month
      |----monthlydata.parquet
      |----Day
            |---dailydata.parquet

现在,当我从年份路径读取df时,spark阅读dailydata.parquet。我如何从所有分区读取每月数据。我尝试使用设置选项mergeSchema = true,这会产生错误。

1 个答案:

答案 0 :(得分:1)

我会敦促你停止做以下事情:

year
 |---Month
      |----monthlydata.parquet
      |----Day
            |---dailydata.parquet

当您从year/month/或甚至只是year/阅读时,您不会获得monthlydata.parquet,您也将获得dailydata.parquet。我无法说出你所得到的错误(请发布),但我的拙见建议是将HDFS中的路径分开,因为你已经复制了数据:

dailies
 |---year
     |---Month
          |----Day
                |---dailydata.parquet
monthlies
 |---year
     |---Month
          |----monthlydata.parquet

是否有理由将它们保存在同一目录中?

但是,如果您坚持使用此结构,请使用以下内容:

schema = "dailydata1"
val dfList = dates.map { case (month, day) =>
  Try(sqlContext.read.parquet(s"/hdfs/table/month=$month/day=$day/$schema.parquet"))
}
val dfUnion = dfList.collect { case Success(v) => v }.reduce { (a, b) =>
  a.unionAll(b)
}

您可以在schemadailydata1等之间切换dailydata2