在 Spark 中使用目录进行分区修剪 SQL
Use directories for partition pruning in Spark SQL
我有数据文件(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 我创建了一个临时 table:
CREATE TEMPORARY TABLE dataTable
USING org.apache.spark.sql.json
OPTIONS (
path "dataroot/*"
)
查询 table 效果很好,但我目前无法使用目录进行修剪。
有没有办法将目录结构注册为分区(不使用Hive)以避免查询时扫描整棵树?假设我想比较每个月第一天的数据,只读取这几天的目录。
使用 Apache Drill,我可以在 dir0
等查询期间使用目录作为谓词。是否可以使用 Spark SQL 做类似的事情?
据我所知,分区自动发现仅适用于 SparkSQL 中的镶木地板文件。参见 http://spark.apache.org/docs/latest/sql-programming-guide.html#partition-discovery
使用EXPLAIN
查看物理计划,以便扫描哪个文件夹。
此外,您可以在创建 table 时描述分区,以便 Spark 可以使用它。
我不确定 Spark 1.6 是否正确使用分区修剪,将 spark.sql.hive.convertMetastoreParquet
设置为 false,我可以看到它但是设置为 true(默认),我可以看到 Spark 将扫描所有分区(但这不影响完全没有表现)。
我有数据文件(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 我创建了一个临时 table:
CREATE TEMPORARY TABLE dataTable
USING org.apache.spark.sql.json
OPTIONS (
path "dataroot/*"
)
查询 table 效果很好,但我目前无法使用目录进行修剪。
有没有办法将目录结构注册为分区(不使用Hive)以避免查询时扫描整棵树?假设我想比较每个月第一天的数据,只读取这几天的目录。
使用 Apache Drill,我可以在 dir0
等查询期间使用目录作为谓词。是否可以使用 Spark SQL 做类似的事情?
据我所知,分区自动发现仅适用于 SparkSQL 中的镶木地板文件。参见 http://spark.apache.org/docs/latest/sql-programming-guide.html#partition-discovery
使用EXPLAIN
查看物理计划,以便扫描哪个文件夹。
此外,您可以在创建 table 时描述分区,以便 Spark 可以使用它。
我不确定 Spark 1.6 是否正确使用分区修剪,将 spark.sql.hive.convertMetastoreParquet
设置为 false,我可以看到它但是设置为 true(默认),我可以看到 Spark 将扫描所有分区(但这不影响完全没有表现)。