我使用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'
)
|
3条答案
按热度按时间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)
数据源流-默认情况下,此流已启用分区修剪。
djp7away2#
当metastore没有分区列的分区值时,就会发生这种情况。我们能逃离Spark吗
然后重新运行相同的查询。
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它不能作为配置单元的一部分工作。