最近我为 Hive 启用了 Sentry 策略文件。因此,当我尝试使用 Impala-JDBC4(版本 2.5.16)在 Impala 中执行查询时,我收到此错误:
errorMessage:AuthorizationException: User '' does not have privileges to execute 'SELECT' on: db.table
在我的代码中,我设置了数据库管理员帐户的用户和密码。所以我不明白为什么它不这么读。
public static double getDolarFromImpala(String date) {
double dolar = 0.0;
try {
Class.forName(JDBC_DRIVER_IMPALA);
String sql = "SELECT value FROM db.table where date ='"+date+"'";
String JDBC_IMPALA_URL = "jdbc:impala://impala1:21050;auth=noSasl;UseNativeQuery=1";
Connection con = DriverManager.getConnection(JDBC_IMPALA_URL,IMPALA_USER,IMPALA_PASSWORD);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
dolar = rs.getDouble("value");
}
stmt.close();
con.close();
}
catch(SQLException se){
//Handle errors for JDBC
se.printStackTrace();
}
catch(Exception e){
//Handle errors for Class.forName
e.printStackTrace();
}
return dolar;
}
我做错了什么?
您收到此错误是因为您用来运行代码的用户没有您在 impala 中使用的数据库的权限。要启用此功能,请按照以下命令操作。
注意:所有这些命令都应从 Impala 超级用户执行
首先您必须为您的工作创建一个角色
CREATE ROLE role_name;
接下来,您必须向您正在使用的用户授予该特定角色GRANT ROLE role_name TO GROUP user_name
(我使用功能用户,您也可以命名用户而不是组)
最后一步是为该特定角色授予数据库权限 GRANT ALL ON database database_name TO ROLE role_name;
执行此步骤后,尝试从您授予角色的用户运行代码。
有关更多信息,请访问此链接:https://www.cloudera.com/documentation/enterprise/5-5-x/topics/sg_hive_sql.html