【问题标题】:Reading different Schema in Parquet Partitioned Dir structure在 Parquet Partitioned Dir 结构中读取不同的模式
【发布时间】:2017-08-23 18:24:18
【问题描述】:

我在使用 spark 编写的 hdfs 上有以下分区镶木地板数据:

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

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

【问题讨论】:

    标签: pyspark parquet pyspark-sql


    【解决方案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)
    }
    

    您可以在dailydata1dailydata2 等之间切换schema

    【讨论】:

    • 实际上它的面向对象设计是我在 hdfs 上镜像的。不会只有一个 dailydata.parquet 而是其他几个,例如具有不同模式的dailydata1.parquet(我不想要多个级别为具有相同路径的不同对象在整个 HDFS 上复制)并且由于 spark 强制执行惰性评估,因此不会读取将由适当的过滤器处理。我正在寻找这样的过滤器。
    • 每个你的设计可以在同一天有dailydata1.parquetdailydata2.parquet吗(即/2017/03/30/dailydata1.parquet/2017/03/30/dailydata2.parquet)?您的设计的问题是您需要代码级过滤器来创建一堆要读取的路径,然后.unionAll 数据帧和一个减少。我将在编辑中添加一个代码 sn-p。
    • 好的。我认为这对火花来说非常昂贵。正确的?我将为两者使用不同的目录。
    猜你喜欢
    • 2018-04-11
    • 2020-12-15
    • 2016-03-16
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2017-09-25
    • 2017-03-04
    相关资源
    最近更新 更多