跨账号场景下EMR SparkSQL创建视图为何需Glue增删表权限?
跨账号SparkSQL创建视图的Glue权限疑问
我在A账号的EMR集群上运行SparkSQL作业,从B账号的AWS Glue目录(关联S3)获取数据,执行的是创建或替换employee视图的语句,具体SQL如下:
CREATE OR REPLACE VIEW employee AS SELECT pay.recordid, pay.employeeid, pay.amount, pay.paycode, pay.paydate, pay.paycycle, pay.updatetime FROM database.table pay WHERE pay.partition_0 in (var1) and pay.partition_1 in (var2) and pay.partition_2 in (var3) and paycode = 'P1' AND paycycle = 'M' AND country = 'test' AND paydate = ( SELECT DISTINCT paydate FROM default.table2 WHERE CURRENT_DATE < DATE(paydate) AND CURRENT_DATE > DATE(payperiodstart) AND paycycle = 'M') AND amount > 0;
目前必须为该作业授予Glue:CreateTable和Glue:DeleteTable权限才能成功执行,移除这两个权限则查询失败。作为Glue账号(B账号)的所有者,我仅希望授予只读权限(glue:GetDatabase、glue:GetUserDefinedFunctions、glue:GetTable、glue:GetPartitions)以降低安全风险,因此有两个疑问:
- 为何创建视图需要这两个增删权限?
- 能否仅用只读权限完成该查询?
为什么创建视图需要Glue:CreateTable和Glue:DeleteTable权限?
- Spark处理
CREATE OR REPLACE VIEW语句时,会将视图的元数据存入配置的元数据仓库。如果你的EMR集群用AWS Glue作为元存储,视图会被Glue当作特殊类型的Table管理。 - 执行
REPLACE操作时,Spark会先删除已存在的同名视图元数据(对应Glue:DeleteTable权限),再创建新的视图元数据(对应Glue:CreateTable权限)。如果作业是直接在B账号的Glue目录中创建视图,自然需要B账号Glue的这两个权限。
能否仅用只读权限完成该查询?
可以,有几种调整方式:
- 用临时视图替代持久化视图:如果不需要把视图长期存在Glue里,仅在作业会话内使用,改成
CREATE TEMP VIEW或CREATE GLOBAL TEMP VIEW。这类临时视图的元数据只在Spark作业运行期间存在,不会写入Glue,仅需B账号Glue的只读权限就能正常执行。 - 在EMR所属账号的Glue目录创建视图:如果需要持久化视图,将视图创建在A账号自己的Glue目录中,而非B账号的目录。这时仅需对A账号的Glue有增删权限,对B账号的Glue保留只读权限即可,既满足需求又不增加B账号的安全风险。
- 直接执行查询输出结果:如果不需要创建视图,直接运行
SELECT语句将结果写入S3或其他存储,完全跳过视图创建步骤,仅需B账号Glue的只读权限和对应存储的读写权限即可。
内容的提问来源于stack exchange,提问作者Saksham Agarwal
相关产品推荐
相关产品推荐

