【Spark】Expected only partition pruning predicates

在Hive向Spark迁移时,我们可能直接将HSQL语句直接运行在Spark-SQL上,如果查询时针对的是Hive分区表(非DataSource表,DataSource表无此问题),使用分区字段过滤时分区字段为大写,就会产生 Expected only partition pruning predicates 的异常,下面举个例子:

有一张Hive分区表test:
表schema信息为(id Int, name String, statis_date String) ,其中statis_date为分区字段,表实际数据暂有两个分区:statis_date='20170101'和statis_date='20170102'

那么在Hive使用HSQL查的时候,我们可以使用 SELECT ID FROM TEST WHERE STATIS_DATE='20170101' ,这是没有问题的,可以查出数据。
但是如果直接使用Spark-SQL运行,是会报上述异常的。原因如下:
Spark-SQL默认是大小写不敏感的,分区字段也就是 STATIS_DATE 在hive metastore里面是小写存储的,但是Spark-SQL在查分区表使用 listPartitionsByFilter 验证predicates表达式时,对 STATIS_DATE 没有做toLowerCase处理,导致Spark认为 STATIS_DATE 不是分区字段,抛出异常。所以在Spark-SQL执行HSQL时需要将分区过滤字段改为小写。

值得注意的是,对于普通字段大小写Spark-SQL都是支持的,即:
SELECT ID FROM TEST WHERE statis_date='20170101'