2015-03-08 4 views
3

Я пытаюсь выполнить простой запрос в Java с базой данных Cassandra, но я не понимаю, мой пример это не работает:Cassandra Java запрос

public class Test { 

    public static void main(String[] args) 
    { 
     Cluster cluster = Cluster.builder() 
          .addContactPoints("127.0.0.1") 
          .build(); 
     Session session = cluster.connect("test"); 

     ResultSet results = session.execute("SELECT * FROM datatest"); 
     for (Row row : results) { 
      System.out.println(row.getString("name")); 
     } 
    } 

} 

Когда я исполню мой код у меня есть эта ошибка:

[main] INFO com.datastax.driver.core.policies.DCAwareRoundRobinPolicy - Using data-center name 'datacenter1' for DCAwareRoundRobinPolicy (if this is incorrect, please provide the correct datacenter name with DCAwareRoundRobinPolicy constructor) 
[main] INFO com.datastax.driver.core.Cluster - New Cassandra host /127.0.0.1:9042 added 
Exception in thread "main" java.lang.IllegalArgumentException: name is not a column defined in this metadata 
    at com.datastax.driver.core.ColumnDefinitions.getAllIdx(ColumnDefinitions.java:273) 
    at com.datastax.driver.core.ColumnDefinitions.getFirstIdx(ColumnDefinitions.java:279) 
    at com.datastax.driver.core.ArrayBackedRow.getIndexOf(ArrayBackedRow.java:69) 
    at com.datastax.driver.core.AbstractGettableData.getString(AbstractGettableData.java:137) 
    at fakemillions.Test.main(Test.java:23) 

Это моя база данных:

My database screenshot

ответ

3

Это звучит например, вы не указали столбец с именем «name» в таблице datatest. Я не использовал драйвер Datastax раньше, но как documentation говорит IllegalArgumentException отбрасывается, если

имя не является частью ResultSet эта строка является частью, т.е. если! This.columns(). Имена() .contains (name)

Было бы лучше, если бы вы указали, как вы создали таблицу данных.

2

При создании таблицы с помощью бережливости, которая содержит динамические столбцы, и поэтому не дает четкие определения столбцов, то CQL по умолчанию назначить следующие имена: key, column1, value. В вашем случае оно будет содержать column1, содержащее значение «имя», колонка value будет содержать «TiTi» и т. Д.

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

Вот хорошее руководство для переноса таблиц бережливости в CQL: http://www.datastax.com/dev/blog/thrift-to-cql3

1

Попробуйте эту работу в моем случае

Cluster.Builder builder = Cluster.builder(); 
Cluster cluster=builder.withLoadBalancingPolicy(new TokenAwarePolicy(new DCAwareRoundRobinPolicy("us-east"))).addContactPoints("127.0.0.1").build(); 
Смежные вопросы