更新时间:2024-08-03 GMT+08:00

分析Impala数据

功能简介

本小节介绍了如何使用样例程序完成分析任务。本章节以使用JDBC接口提交数据分析任务为例。

样例代码

使用Impala JDBC接口提交数据分析任务,参考样例程序中的JDBCExample.java。
  1. 修改以下变量为false,标识连接集群的认证模式为普通模式。
     // 所连接集群的认证模式是否在安全模式 
       boolean isSecureVer = false;
  2. 定义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"}; 
  3. 拼接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失败。

  4. 加载Hive JDBC驱动。
       // 加载Hive JDBC驱动 
       Class.forName(HIVE_DRIVER);
  5. 填写正确的用户名,获取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(); 
           } 
         } 
       }