尽管有火花滤光片,但蜂巢分区的表仍读取所有分区



我正在使用Spark与Scala读取特定的蜂巢分区。该分区是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次,最新失败:丢失任务236.3阶段0.0(TID 287,Server 287,Server,executor,executor 17(:org.apache.apache。= w/b = x/part-00002":用户: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却没有?

我缺少火花配置?

编辑:更多信息

有些文件是用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'
)
|

spark中的镶木蜂巢表可以使用以下2个读取流 -

  1. 蜂巢流 - 当spark.sql.hive.convertMetastoreParquet设置为false时,将使用此方法。在这种情况下,要划分拟合工作以工作,您必须设置spark.sql.hive.metastorePartitionPruning=true

    spark.sql.hive.hive.metastorepartition pruning:当正确时,一些谓词 将被推到蜂巢元马托尔,以便无与伦比 可以较早地消除分区。这只会影响蜂巢桌 未转换为FileSource关系(请参阅 hiveutils.convert_metastore_parquet和 hiveutils.convert_metastore_orc有关更多信息

  2. dataSource流 - 默认情况下,该流程的分区修剪已打开。

当metastore没有分区列的分区值时,这可能会发生。我们可以从Spark

跑吗
ALTER TABLE db.table RECOVER PARTITIONS

然后重新运行相同的查询。

您将无法在表中阅读特殊分区,您无法使用Spark-Hive API访问其所有分区。Spark使用蜂巢表访问权限,在Hive中您需要完全访问该表。

您无法将Spark-Hive视为Unix访问的原因。如果需要这样做,它使用spark.csv(或任何格式(。然后将数据读取为基于文件。

您可以简单地使用spark.csv.read("/path-to-table/table/year=2019/month=2/day=27/a=w/b=x/part-")

如果您需要验证我的答案,请忽略Spark并尝试在Hive Shell中运行相同的查询,它将无法作为Hive配置的一部分。

最新更新