Spark和Parquet:读取分区数据

Gas*_*ove 5 apache-spark-sql

SparkSQL有一个很好的技巧:它将读取您的镶木地板数据,正确地从镶木地板的元数据中读取模式.更重要的是:如果您使用key=value模式对数据进行分区,SparkSQL将自动递归目录结构,将其value作为一个名为的列读取key.关于此的文档 - 以及一个非常明确的例子 - 在这里.

不幸的是,我的数据以一种适用于Cascading的方式进行分区,似乎并不符合SparkSQL的期望:

2015/
??? 04
    ??? 29
    ?   ??? part-00000-00002-r-00000.gz.parquet
    ??? 30
        ??? part-00000-00001-r-00000.gz.parquet
Run Code Online (Sandbox Code Playgroud)

在层叠,我可以指定一个PartitionTap,告诉它的前三个项目将是year,monthday,我去比赛.但我无法弄清楚如何在SparkSQL中实现类似的效果.可以做以下任何一项:

  1. 只是忽略分区; 递归到镶木地板数据并读取所有找到的内容.(我知道我可以使用Hadoop的FileSystemAPI将自己的代码转换为此效果,但我真的不愿意.)
  2. 指定部分模式 - 例如"列是年(int),月(int),日(int),再加上从镶木地板推断其余部分"
  3. 指定整个架构?

(我的镶木地板数据包含嵌套结构,只要我允许它自动执行,SparkSQL可以很好地读取和交互.如果我尝试手动指定Schema,它似乎无法处理嵌套结构.)