我有一个外部分区(按:source,execution_id,entity_name)Hive表,名称为business_views。
我想知道同时启动这两个动作是否有问题:
ALTER TABLE business_views DROP IF EXISTS PARTITION (entity_name = 'XXXX')
运行在分区表business_views内编写的spark scala程序:
DbUtils.scala:
spark.catalog.refreshTable(s"$DATABASE_NAME.$tableName")
df
.select(XXXXXXXXXXXXXXXXXXXXXXXXXXX)
.repartition($"source", $"execution_id", $"entity_name")
.write
.format("parquet")
.insertInto(business_views)
实际上,我们需要在编写Spark作业时在表中清理一些表分区。
当我在spark sql作业期间启动回滚(分区清理)时,出现以下错误:
org.apache.spark.SparkException:作业中止。在 com.socgen.drhg.dhr.utils.DbUtils $ .writeToTableBv(DbUtils.scala:92)
和
由以下原因引起:org.apache.hadoop.security.AccessControlException: 权限被拒绝:用户= XXXXXX,访问权限=执行, inode =“ / XXXXXX / XXXXXX / XXXXXX / XXXXXX / business-views / source = XXXXXX / execution_id = XXXXXX / entity_name = XXXXXX”:hdfs:hdfs:drwx ----
但是放置分区可以正常工作(回滚)。
我不确定这两个动作之间是否存在真正的联系。
我们的配置单元配置:
ACID未激活 hive.support.concurrency = false
我认为,如果没有启用并发,则表上没有锁,因此唯一的问题应该是数据上的不一致问题,但没有真正的错误。
所以我的问题是:如果在sparkSql作业创建/丰富新分区的同时删除分区,会不会有问题?