2016-11-16 5 views
0

Я создал таблицу в Hbase, используя оболочку, которая содержит 2 семейства столбцов. Я могу писать в нее с помощью API-интерфейса клиента Hbase. Я использую драйвер JDBC phoenix для запроса данных из него. Я узнал, что нет сопоставления между таблицами HBase и Phoenix. Таким образом, я создал представление для моей существующей таблицы, но всякий раз, когда я запускаю мой код я получаюApache Phoenix create view throws TableAlreadyExistException

org.apache.phoenix.schema.TableAlreadyExistsException: ERROR 1013 (42M04): Table already exists. tableName=test 
at org.apache.phoenix.schema.MetaDataClient.createTableInternal(MetaDataClient.java:1911) 
at org.apache.phoenix.schema.MetaDataClient.createTable(MetaDataClient.java:744) 
at org.apache.phoenix.compile.CreateTableCompiler$2.execute(CreateTableCompiler.java:186) 
at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:303) 
at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:295) 
at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53) 
at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:293) 
at org.apache.phoenix.jdbc.PhoenixStatement.executeUpdate(PhoenixStatement.java:1236) 
at com.lam.app.PhoenixClient.main(PhoenixClient.java:49) 

Мой клиент код, как этот

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class PhoenixClient 
{ 

    public static void main(String[] args) 
    { 
     // Create variables 
     Connection connection = null; 
     Statement statement = null; 
     ResultSet rs = null; 
     PreparedStatement ps = null; 

     try 
     { 
      // Connect to the database 
      connection = DriverManager.getConnection("jdbc:phoenix:zkserver:2181:/hbase-unsecure"); 

      // Create a JDBC statement 
      statement = connection.createStatement(); 

      //HBase table schema - Table name : test, columnfamily 1 - data, ColumnFamily2 - context 
      // Execute our statements 
      statement.executeUpdate("CREATE VIEW \"test\" (pk VARCHAR not null PRIMARY KEY, " 
        + "\"data\".\"mydata\" VARCHAR," + " \"context\".\"mycontext\" VARCHAR)"); 

      //connection.commit(); 

      // Query for table 
      /*ps = connection 
       .prepareStatement("select * from \"test\" WHERE \"mydata\" = \"names\""); 
      rs = ps.executeQuery(); 
      System.out.println("Table Values"); 
      while (rs.next()) 
      { 
       Integer myKey = rs.getInt(1); 
       String myColumn = rs.getString(2); 
       System.out.println("\tRow: " + myKey + " = " + myColumn); 
      }*/ 

     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      if (ps != null) 
      { 
       try 
       { 
        ps.close(); 
       } 
       catch (Exception e) 
       { 
       } 
      } 
      if (rs != null) 
      { 
       try 
       { 
        rs.close(); 
       } 
       catch (Exception e) 
       { 
       } 
      } 
      if (statement != null) 
      { 
       try 
       { 
        statement.close(); 
       } 
       catch (Exception e) 
       { 
       } 
      } 
      if (connection != null) 
      { 
       try 
       { 
        connection.close(); 
       } 
       catch (Exception e) 
       { 
       } 
      } 
     } 

    } 
} 

можно сканировать таблицу с помощью Hbase оболочки и может просматривать данные и я знаю, что имя таблицы чувствительно к регистру (особенно phoenix делает все в верхнем регистре), но не уверен, почему я не могу создать представление. Пожалуйста, помогите

+0

Как говорится в сообщении об ошибке, у вас уже есть таблица с именем «test» в Hbase. дайте другое имя –

+0

@NirmalRam Я знаю, что таблица «test» уже существует, потому что я создал ее с использованием оболочки Hbase, но то, что я пытаюсь сделать, это создать представление для нее с помощью Phoenix, чтобы я мог использовать этот запрос. – AnswerSeeker

+1

Возможно, вы могли бы попытаться сбросить представление перед его созданием? –

ответ

0

Следующее предложение @rickmoritz, я бросил представление, прежде чем создавать его, и это сработало.

statement.executeUpdate("DROP VIEW \"test\""); 

 Смежные вопросы

  • Нет связанных вопросов^_^