我正在使用Spark与Scala读取特定的蜂巢分区。该分区是year
,month
,day
,a
和b
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个读取流 -
-
蜂巢流 - 当
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有关更多信息
-
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配置的一部分。