hive分区表读取所有分区,尽管有一个spark过滤器

zmeyuzjn  于 2021-06-24  发布在  Hive
关注(0)|答案(3)|浏览(523)

我使用scala的spark来读取一个特定的hive分区。分区是 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.sparkeexception:由于阶段失败而中止作业:阶段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配置吗?
编辑:更多信息
有些文件是用配置单元创建的,有些文件是从一台服务器复制的,并以不同的权限粘贴到我们的服务器上(我们不能更改权限),然后它们应该刷新了数据。
我们正在使用:
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'
)
|
zpqajqem

zpqajqem1#

spark中的Parquet配置单元表可以使用以下2个读取流-
Hive流-当 spark.sql.hive.convertMetastoreParquet 设置为 false . 在这种情况下,您必须设置 spark.sql.hive.metastorePartitionPruning=true .
spark.sql.hive.metastorepartitionpruning:如果为true,一些 predicate 将被下推到hive metastore中,以便可以更早地消除不匹配的分区。这只影响未转换为文件源关系的配置单元表(有关详细信息,请参阅hiveutils.convert\u metastore\u parquet和hiveutils.convert\u metastore\u orc)
数据源流-默认情况下,此流已启用分区修剪。

djp7away

djp7away2#

当metastore没有分区列的分区值时,就会发生这种情况。我们能逃离Spark吗

ALTER TABLE db.table RECOVER PARTITIONS

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

2hh7jdfx

2hh7jdfx3#

如果使用spark hive api无法访问表中的所有分区,则无法读取该表中的特殊分区。spark正在使用配置单元表访问权限,在配置单元中,您需要对表进行完全访问。
不能将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它不能作为配置单元的一部分工作。

相关问题