Получение неоднозначного результата с использованием API метаданных JDBC для улья

#jdbc #hive #database-metadata

#jdbc #улей #база данных-метаданные

Вопрос:

Я пытаюсь получить имена таблиц для hive, используя DatabaseMetaData аналогично RDBMS.

Пример кода:

 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);
}
  

В конкретной базе данных нет таблицы. Используя разные имена таблиц, я получаю разные выходные данные.

Например:

Я ввел имя таблицы emp , есть 3 записи с именем emp

Я ввел имя таблицы employee , есть 5 записей с именем employee

Я ввожу имя таблицы emp12 , оно не возвращает записей (что ожидается)


  • Я делаю что-то не так?

  • Разве я не должен использовать DatabaseMetaData для проверки существования таблицы?

Ответ №1:

Мне нужно передать имя схемы в getTables методе

Подпись:

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

Я передал следующие agruments:

  • каталог = null;
  • schemaPattern = имя схемы улья
  • tableNamePattern = имя таблицы улья
  • типы = new String[] { "TABLE" }

Пример кода:

     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 amp;amp; 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);
    }