首页 > 解决方案 > spark.table vs sql() AccessControlException

问题描述

试图运行

  spark.table("db.table")
    .groupBy($"date")
    .agg(sum($"total"))

返回

org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to alter table. java.security.AccessControlException: Permission denied: user=user, access=WRITE, inode="/sources/db/table":tech_user:bgd_group:drwxr-x---

相同的脚本,但写成

  sql("SELECT sum(total) FROM db.table group by date").show()

返回实际结果。

我不明白为什么会这样。第一个试图准确编写的脚本是什么?一些分期结果?我已读取此表的权限,我只是尝试执行一些聚合。为此使用 Spark 2.2。

标签: apache-sparkapache-spark-sql

解决方案


在 Spark 2.2 中,默认值spark.sql.hive.caseSensitiveInferenceMode从更改NEVER_INFERINFER_AND_SAVE. 此模式导致 Spark 推断(从底层文件)并尝试将区分大小写的模式保存到 Hive 元存储中。如果执行命令的用户没有被授予更新 HMS 的权限,这将失败。

明显的解决方法是将推理模式设置回NEVER_INFER,或者INFER_ONLY如果应用程序依赖于文件中存在的列名 (CaseSensitivE)。


推荐阅读