apache-spark - 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。
解决方案
在 Spark 2.2 中,默认值spark.sql.hive.caseSensitiveInferenceMode
从更改NEVER_INFER
为INFER_AND_SAVE
. 此模式导致 Spark 推断(从底层文件)并尝试将区分大小写的模式保存到 Hive 元存储中。如果执行命令的用户没有被授予更新 HMS 的权限,这将失败。
明显的解决方法是将推理模式设置回NEVER_INFER
,或者INFER_ONLY
如果应用程序依赖于文件中存在的列名 (CaseSensitivE)。
推荐阅读
- php - 使用 Laravel 查询表,同时分组和平均
- c# - 使用 HTTP_X_FORWARDED_FOR 时,IpAddress 为空
- java - 如何上传 Android 库仅供私人使用?
- python - 为 Pandas 数据框结合 crosstab-pivot-groupby
- raku - 在 Perl 6 中,如何复制 Perl 的 List::Util::all 的行为?
- android - 如何使用 LocalBroadcastManager 为类编写单元测试?
- scikit-learn - Python:正确的命名法
- javascript - const React 的多个参数
- php - MySQL全文搜索和撇号
- python-2.7 - Python Appengine - 调用 Endpoints 工具时出现“ImportError:无法导入名称 OSRNG”