Pab*_*ego 10 hive scala apache-spark apache-spark-sql
我正在使用带有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.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)
Spark 中的镶木地板配置单元表可以使用以下 2 个读取流 -
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
数据源流 - 默认情况下,此流已打开分区修剪。
| 归档时间: |
|
| 查看次数: |
1145 次 |
| 最近记录: |