Search code examples
jdbchivedatabase-metadata

Getting ambiguous result using JDBC Metadata API for Hive


I am trying to get Table names for hive using DatabaseMetaData in a similar way like RDBMS.

Sample code:

try (Connection con = getJdbcConnection(connectionUri, driverName, username, password);) {
        DatabaseMetaData metadata = con.getMetaData();
        ResultSet rs = metadata.getTables(null, null, tableName, null);
        while (rs.next()) {
            System.out.println(rs.getString(3));
       }

  } catch (SQLException e) {
  }

private static void registerDriver(String driverName) {
        try {
            Class.forName(driverName);
         } catch (ClassNotFoundException e) {
            LOG.error("No class found for " + driverName + ". Details: " + e);
        }
    }

private static Connection getJdbcConnection(String connectionUri, String driverName, String username,
        String password) throws SQLException{
    registerDriver(driverName);
    return DriverManager.getConnection(connectionUri, username,password);
}

There is no table in a particular database. Using different different table names, I am getting different output.

For example:

I put table name emp, there are 3 records with name emp

I put table name employee, there are 5 records with name employee

I put table name emp12, it is returning no records (which is expected)


  • Am I doing something wrong?

  • Shouldn't I use DatabaseMetaData for checking table existence?


Solution

  • I need to pass schema name in getTables method

    Signature:

    ResultSet getTables(String catalog,
                      String schemaPattern,
                      String tableNamePattern,
                      String[] types)
                        throws SQLException
    

    I passed following agruments:

    • catalog = null;
    • schemaPattern = Hive schema Name
    • tableNamePattern = Hive Table Name
    • types = new String[] { "TABLE" }

    Sample code:

        try (Connection con = getJdbcConnection(connectionUri, driverName, username, password);) {
            DatabaseMetaData metadata = con.getMetaData();
            ResultSet rs = metadata.getTables(null, schemaName, tableName, new String[] { "TABLE" });
    
            while (rs.next()) {
                String tName = rs.getString("TABLE_NAME");
                if (tName != null && tName.equals(tableName)) {
                    LOG.info("Table [" + tableName + "] is present in the Database.");
                    return true;
                }
            }
            rs.close();
    
            LOG.info("Table [" + tableName + "] is not present in the Database.");
            return false;
    
        } catch (SQLException e) {
            LOG.error("Not able to get Table Metadata . Caused By: " + e);
        }