Hive分区表读取了所有分区,尽管具有Spark过滤器

Pab*_*ego 10 hive scala apache-spark apache-spark-sql

我正在使用带有scala的spark来读取特定的Hive分区。分区是yearmonthdayab

scala> spark.sql("select * from db.table where year=2019 and month=2 and day=28 and a='y' and b='z'").show

但是我得到这个错误:

org.apache.spark.SparkException:由于阶段失败而导致作业中止:阶段0.0中的任务236失败4次,最近一次失败:阶段0.0中的任务236.3(TID 287,服务器,执行器17)丢失:org.apache.hadoop。 security.AccessControlException:权限被拒绝:user = user,access = READ,inode =“ / path-to-table / table / year = 2019 / month = 2 / day = 27 / a = w / b = x / part-00002 “:user:group:-rw-rw ----

如您所见,spark试图读取一个不同的分区,而我在那里没有权限。

不应该这样,因为我创建了一个过滤器,而这个过滤器就是我的分区。

我用Hive尝试了相同的查询,并且运行完美(无访问问题)

Hive> select * from db.table where year=2019 and month=2 and day=28 and a='y' and b='z';

为什么spark尝试读取此分区,而Hive没有读取?

我缺少一个Spark配置吗?

编辑:更多信息

有些文件是使用Hive创建的,其他文件是从一台服务器复制并以不同的权限粘贴到我们的服务器(我们无法更改权限),那么它们应该已经刷新了数据。

我们正在使用: cloudera 5.13.2.1 hive 1.1.0 spark 2.3.0 hadoop 2.6.0 scala 2.11.8 java 1.8.0_144

显示创建表

|CREATE EXTERNAL TABLE Columns and type
PARTITIONED BY (`year` int COMMENT '*', `month` int COMMENT '*', `day` int COMMENT '*', `a` string COMMENT '*', `b` string COMMENT '*')
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES (
 'serialization.format' = '1'
)
STORED AS
 INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
 OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 'hdfs://path'
TBLPROPERTIES (
 'transient_lastDdlTime' = '1559029332'
)
|
Run Code Online (Sandbox Code Playgroud)

mor*_*007 6

Spark 中的镶木地板配置单元表可以使用以下 2 个读取流 -

  1. Hive 流 - 这将在spark.sql.hive.convertMetastoreParquet设置为 时使用false。为了在这种情况下分区修剪工作,您必须设置spark.sql.hive.metastorePartitionPruning=true.

    spark.sql.hive.metastorePartitionPruning:当为真时,一些谓词将被下推到 Hive 元存储中,以便可以更早地消除不匹配的分区。这仅影响未转换为文件源关系的 Hive 表(有关更多信息,请参阅 HiveUtils.CONVERT_METASTORE_PARQUET 和 HiveUtils.CONVERT_METASTORE_ORC

  2. 数据源流 - 默认情况下,此流已打开分区修剪。