在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'