我有数据文件(在这个例子中是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做类似的事情?
据我所知,分区自动发现只适用于SparkSQL中的parquet文件。看到http://spark.apache.org/docs/latest/sql-programming-guide.html partition-discovery
使用EXPLAIN
查看物理计划,以便扫描哪个文件夹。
也可以在创建表时描述分区,以便Spark可以使用它。
我不确定Spark 1.6使用正确的分区修剪,设置spark.sql.hive.convertMetastoreParquet
为false,我可以看到它,但为true(默认),我可以看到Spark将扫描所有分区(但这根本不影响性能)。