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

时间:2015-07-24 14:24:24

标签: 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
            +-- 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/*"
)

查询表格效果很好但我到目前为止还无法使用这些目录进行修剪。

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

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

2 个答案:

答案 0 :(得分:1)

据我所知,分区自动发现仅适用于SparkSQL中的镶木地板文件。见http://spark.apache.org/docs/latest/sql-programming-guide.html#partition-discovery

答案 1 :(得分:-1)

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

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

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