美文网首页
【Spark】Expected only partition p

【Spark】Expected only partition p

作者: PowerMe | 来源:发表于2017-09-13 09:59 被阅读186次

    在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的方式修改源码解决。

    相关文章

      网友评论

          本文标题:【Spark】Expected only partition p

          本文链接:https://www.haomeiwen.com/subject/wulksxtx.html