更新时间:2024-08-03 GMT+08:00
分析Impala数据
功能简介
本小节介绍了如何使用样例程序完成分析任务。本章节以使用JDBC接口提交数据分析任务为例。
样例代码
使用Impala JDBC接口提交数据分析任务,参考样例程序中的JDBCExample.java。
- 修改以下变量为false,标识连接集群的认证模式为普通模式。
// 所连接集群的认证模式是否在安全模式 boolean isSecureVer = false;
- 定义Impala SQL。Impala SQL必须为单条语句,注意不能包含“;”。
// 定义HQL,不能包含“;” String[] sqls = {"CREATE TABLE IF NOT EXISTS employees_info(id INT,name STRING)", "SELECT COUNT(*) FROM employees_info", "DROP TABLE employees_info"};
- 拼接JDBC URL。
// 拼接JDBC URL StringBuilder sBuilder = new StringBuilder( "jdbc:hive2://").append("impalad_ip").append("/"); if (isSecurityMode) { // 安全模式 sBuilder.append(";auth=") .append(clientInfo.getAuth()) .append(";principal=") .append(clientInfo.getPrincipal()) .append(";"); } else { // 普通模式 sBuilder.append(";auth=noSasl"); } String url = sBuilder.toString();
直连Impalad实例时,若当前连接的Impalad实例故障则会导致访问Impala失败。
- 加载Hive JDBC驱动。
// 加载Hive JDBC驱动 Class.forName(HIVE_DRIVER);
- 填写正确的用户名,获取JDBC连接,确认Impala SQL的类型(DDL/DML),调用对应的接口执行Impala SQL,输出查询的列名和结果到控制台,关闭JDBC连接。
Connection connection = null; try { // 获取JDBC连接 // 第二个参数需要填写正确的用户名,否则会以匿名用户(anonymous)登录 connection = DriverManager.getConnection(url, "userName", ""); // 建表 // 表建完之后,如果要往表中导数据,可以使用LOAD语句将数据导入表中,比如从HDFS上将数据导入表: //load data inpath '/tmp/employees.txt' overwrite into table employees_info; execDDL(connection,sqls[0]); System.out.println("Create table success!"); // 查询 execDML(connection,sqls[1]); // 删表 execDDL(connection,sqls[2]); System.out.println("Delete table success!"); } finally { // 关闭JDBC连接 if (null != connection) { connection.close(); } public static void execDDL(Connection connection, String sql) throws SQLException { PreparedStatement statement = null; try { statement = connection.prepareStatement(sql); statement.execute(); } finally { if (null != statement) { statement.close(); } } } public static void execDML(Connection connection, String sql) throws SQLException { PreparedStatement statement = null; ResultSet resultSet = null; ResultSetMetaData resultMetaData = null; try { // 执行Impala SQL statement = connection.prepareStatement(sql); resultSet = statement.executeQuery(); // 输出查询的列名到控制台 resultMetaData = resultSet.getMetaData(); int columnCount = resultMetaData.getColumnCount(); for (int i = 1; i <= columnCount; i++) { System.out.print(resultMetaData.getColumnLabel(i) + '\t'); } System.out.println(); // 输出查询结果到控制台 while (resultSet.next()) { for (int i = 1; i <= columnCount; i++) { System.out.print(resultSet.getString(i) + '\t'); } System.out.println(); } } finally { if (null != resultSet) { resultSet.close(); } if (null != statement) { statement.close(); } } }
父主题: 开发Impala应用