2013-08-27 2 views
0

Я использую Astyanax для запроса Cassandra с использованием запросов CQL3, и он работает нормально.Как получить типы данных из запроса SQL-сервера Astyanax

Я только хочу, чтобы сделать запросы (SELECT ...), и я использую следующий код, например:

AstyanaxContext<Keyspace> context = new AstyanaxContext.Builder() 
    .forCluster("anyCluster") // Not using clusters 
    .forKeyspace("default") // Name of my keyspace 
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() 
    .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE) 
    .setCqlVersion("3.0.0") 
    .setTargetCassandraVersion("1.2") 
    ) 
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool") 
    .setPort(9160) 
    .setMaxConnsPerHost(1) 
    .setSeeds("localhost:9160") 
    ) 
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor()) 
    .buildKeyspace(ThriftFamilyFactory.getInstance()); 

    context.start(); 
    Keyspace keyspace = context.getClient(); 

    // Defining any columnfamily 
    ColumnFamily<String, String> cf = 
      new ColumnFamily<String, String>(
       ".",    // It works without passing here the name. 
       StringSerializer.get(), // Key Serializer 
       StringSerializer.get()); 

предыдущий код является частью соединения, и теперь я хочу, чтобы выполнить запросы и получить данные, но я не знаю, какой тип данных я ожидаю в запросах, поэтому я не знаю, какой метод использовать для получения значений, как вы можете видеть ниже, я не знаю, если я необходимо использовать getBooleanValue, getStringValue, getIntegerValue и т.д.

try { 
     OperationResult<CqlResult<String, String>> result 
     = keyspace.prepareQuery(emp2).withCql("Select * from table_test;").execute(); 

     for (Row<String, String> row : result.getResult().getRows()) { 

      ColumnList<String> cols = row.getColumns(); 
      System.out.println(cols.getColumnNames()); 

      for(String col : cols.getColumnNames()){ 

       try{ 
        boolean value = cols.getBooleanValue(col, null); 
        System.out.println(value); 
       }catch(Exception e){ 
        System.out.println(col + " isn't boolean"); 
       } 
       try{ 
        Date value = cols.getDateValue(col, null); 
        System.out.println(value); 
       }catch(Exception e){ 
        System.out.println(col + " isn't Date"); 
       } 
       try{ 
        Integer value = cols.getIntegerValue(col, null); 
        System.out.println(value); 
       }catch(Exception e){ 
        System.out.println(col + " isn't Integer"); 
       } 
       try{ 
        Double value = cols.getDoubleValue(col, null); 
        System.out.println(value); 
       }catch(Exception e){ 
        System.out.println(col + " isn't Double"); 
       } 
       try{ 
        String value = cols.getStringValue(col, null); 
        System.out.println(value); 
       }catch(Exception e){ 
        System.out.println(col + " isn't string"); 
       } 
      } 
     } 
    } catch (ConnectionException e) { 
     e.printStackTrace(); 
    } 

Так есть способ, которым я могу это знать? используя этот API, или, возможно, с другим.

спасибо.

ответ

2

Я думаю, что клиент Astyanax не может предоставить вам всю информацию о типах данных, а используя CQLSH, вы можете получить большинство из них.

select column_name, comparator, column_aliases,key_alias,key_validator from system.schema_columns where keyspace_name='#KS' AND columnfamily_name='#CF'; 

Кроме того, для любой другой меты поля соответствующей информации, которую вы можете увидеть структуру

CREATE TABLE schema_keyspaces (
    keyspace_name text PRIMARY KEY, 
    durable_writes boolean, 
    strategy_class text, 
    strategy_options text 
); 


CREATE TABLE schema_columnfamilies (
    keyspace_name text, 
    columnfamily_name text, 
    bloom_filter_fp_chance double, 
    caching text, 
    column_aliases text, 
    comment text, 
    compaction_strategy_class text, 
    compaction_strategy_options text, 
    comparator text, 
    compression_parameters text, 
    default_read_consistency text, 
    default_validator text, 
    default_write_consistency text, 
    gc_grace_seconds int, 
    id int, 
    key_alias text, 
    key_aliases text, 
    key_validator text, 
    local_read_repair_chance double, 
    max_compaction_threshold int, 
    min_compaction_threshold int, 
    read_repair_chance double, 
    replicate_on_write boolean, 
    subcomparator text, 
    type text, 
    value_alias text, 
    PRIMARY KEY (keyspace_name, columnfamily_name) 
); 

CREATE TABLE schema_columns (
    keyspace_name text, 
    columnfamily_name text, 
    column_name text, 
    component_index int, 
    index_name text, 
    index_options text, 
    index_type text, 
    validator text, 
    PRIMARY KEY (keyspace_name, columnfamily_name, column_name) 
); 
+0

Я закончил с использованием 'выберите компаратор, column_aliases, key_alias, key_validator из system.schema_columnfamilies где "ColumnFamily"= '# CF',' 'для Составной KEY' и теперь хотите использовать запрос, чтобы получить те, которые не являются «PRIMARY KEY», но не показывают некоторые таблицы (эти таблицы не создаются с помощью «COMPACT STORAGE», вы знаете, почему это может происходить? и что делать? – eLRuLL

+0

таблицы, не отображаемые вашим запросом, - это те, которые были созданы с помощью «КОМПАКТНОГО ХРАНЕНИЯ» (по предыдущему комментарию я сказал наоборот) – eLRuLL

+0

Я немного смущен. Вам действительно нужен CF с компактным хранилищем, зная тот факт, что они поддерживают один и только один столбец за пределами одной части ПЕРВИЧНОГО КЕ Y. – abhi

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