【Spark】Expected only partition p
在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'
SELECT id FROM TEST WHERE statis_date='20170101'
都是可以的。
所以分区字段过滤大小写敏感问题也应该作为Spark和Hive的一个不兼容点记录下来。
另外,社区对这个问题应该有一个issue:https://issues.apache.org/jira/browse/SPARK-19490
也可以根据issue的方式修改源码解决。