/**
   * Creates a HiveQL external table.
   *
   * @param query
   * @return True if the table could be created, false otherwise.
   */
  public boolean doCreateTable(String query) {
    Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;
    boolean res = true;

    try {
      // get a connection to the Hive/Shark server
      con = getConnection();

      // create a statement
      stmt = con.createStatement();

      // execute the query
      rs = stmt.executeQuery(query);
    } catch (Throwable e) {
      LOGGER.error(
          "Runtime error (The Hive table cannot be created. Hive query='"
              + query
              + "'. Details="
              + e.getMessage()
              + ")");
      res = false;
    } finally {
      return res && closeHiveObjects(con, stmt, rs);
    } // try catch finally
  } // doCreateTable
  /**
   * Close all the Hive objects previously opened by doCreateTable and doQuery.
   *
   * @param con
   * @param stmt
   * @param rs
   * @return True if the Hive objects have been closed, false otherwise.
   */
  private boolean closeHiveObjects(Connection con, Statement stmt, ResultSet rs) {
    boolean res = true;

    if (con != null) {
      try {
        con.close();
      } catch (SQLException e) {
        LOGGER.error(
            "Runtime error (The Hive connection could not be closed. Details="
                + e.getMessage()
                + ")");
        res = false;
      } // try catch // try catch
    } // if

    if (stmt != null) {
      try {
        stmt.close();
      } catch (SQLException e) {
        LOGGER.error(
            "Runtime error (The Hive statement could not be closed. Details="
                + e.getMessage()
                + ")");
        res = false;
      } // try catch // try catch
    } // if

    if (rs != null) {
      try {
        rs.close();
      } catch (SQLException e) {
        LOGGER.error(
            "Runtime error (The Hive result set could not be closed. Details="
                + e.getMessage()
                + ")");
        res = false;
      } // try catch // try catch
    } // if

    return res;
  } // closeHiveObjects
  /**
   * Executes a HiveQL sentence.
   *
   * @param query
   * @return True if the query succeded, false otherwise.
   */
  public boolean doQuery(String query) {
    Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;
    boolean res = true;

    try {
      // get a connection to the Hive/Shark server
      con = getConnection();

      // create a statement
      stmt = con.createStatement();

      // execute the query
      rs = stmt.executeQuery(query);

      // iterate on the result
      while (rs.next()) {
        String s = "";

        for (int i = 1; i < rs.getMetaData().getColumnCount(); i++) {
          s += rs.getString(i) + ",";
        } // for

        s += rs.getString(rs.getMetaData().getColumnCount());
      } // while
    } catch (Throwable e) {
      LOGGER.error(
          "Runtime error (The Hive query cannot be executed. Hive query='"
              + query
              + "'. Details="
              + e.getMessage()
              + ")");
      res = false;
    } finally {
      return res && closeHiveObjects(con, stmt, rs);
    } // try catch finally
  } // doQuery
  /**
   * Gets a connection to the Hive server.
   *
   * @return
   * @throws Exception
   */
  private Connection getConnection() throws Exception {
    // dynamically load the Hive JDBC driver
    Class.forName(DRIVERNAME);

    // return a connection based on the Hive JDBC driver
    LOGGER.debug(
        "Connecting to jdbc:hive://"
            + hiveServer
            + ":"
            + hivePort
            + "/default?user="******"&password=XXXXXXXXXX");
    return DriverManager.getConnection(
        "jdbc:hive://"
            + hiveServer
            + ":"
            + hivePort
            + "/default?user="******"&password="
            + hadoopPassword);
  } // getConnection