
# 分析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();
   ```
   ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
   直连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(); 
          } 
        } 
      }
   ```
   
 
