Apache spark 在Spark SQL中使用目录进行分区修剪

Apache spark 在Spark SQL中使用目录进行分区修剪,apache-spark,apache-spark-sql,apache-drill,Apache Spark,Apache Spark Sql,Apache Drill,我有数据文件(本例中为json,但也可以是avro)以如下目录结构编写: dataroot +-- year=2015 +-- month=06 +-- day=01 +-- data1.json +-- data2.json +-- data3.json +-- day=02 +-- data1.json +-- data2.json

我有数据文件(本例中为json,但也可以是avro)以如下目录结构编写:

dataroot
+-- year=2015
    +-- month=06
        +-- day=01
            +-- data1.json
            +-- data2.json
            +-- data3.json
        +-- day=02
            +-- data1.json
            +-- data2.json
            +-- data3.json
    +-- month=07
        +-- day=20
            +-- data1.json
            +-- data2.json
            +-- data3.json
        +-- day=21
            +-- data1.json
            +-- data2.json
            +-- data3.json
        +-- day=22
            +-- data1.json
            +-- data2.json
我使用spark sql创建了一个临时表:

CREATE TEMPORARY TABLE dataTable
USING org.apache.spark.sql.json
OPTIONS (
  path "dataroot/*"
)
查询表工作得很好,但到目前为止,我无法使用目录进行修剪

有没有办法将目录结构注册为分区(不使用配置单元)以避免在查询时扫描整个树?假设我想比较每个月的第一天的数据,并且只读取这些天的目录


使用Apache Drill,我可以在使用
dir0
等进行查询时使用目录作为谓词。是否可以使用Spark SQL执行类似操作?

据我所知,分区自动发现仅适用于SparkSQL中的拼花文件。请参见

使用
解释
查看物理计划,以便扫描哪个文件夹

另外,您可以在创建表时描述分区,以便Spark可以使用它


我不确定Spark 1.6是否正确使用分区修剪,设置
Spark.sql.hive.convertMetastoreParquet
为false,我可以看到它,但为true(默认),我可以看到Spark将扫描所有分区(但这根本不会影响性能)。

而parquet文件读取确实支持类似于发现hive的分区。根据我的经验,数据目录不是作为分区加载的。也就是说,当你查询分区键时,你仍然在扫描整棵树(也就是说,没有修剪-不是询问者想要的)。@jack it使用分区跳过目录,而不是读取目录(同样只针对拼花地板文件)。自从那条评论之后,我实际上学到了更多。因此,您从分区中获得的优化是可用的,但只有在使用DataFramesAPI时才可用。如果您转换为RDD(或者甚至在使用DataSetsAPI时,据我所知),它将始终读取所有目录,即使它不必读取。您看,您所说的是准确的,但只有在使用DataFrame API时。Spark中基于文本文件的表现在可以进行分区修剪了吗?您能解决这个问题吗?不,在提出问题时没有,从那时起我就没有研究过这个特定的案例。每个问题都是不同的,然而,在不同的问题设置中,翻转开关有帮助。嗯,这总是值得一试的。