有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

CassandraJava请求

我试图使用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) 个答案

  1. # 1 楼答案

    当您使用thrift创建一个表时,它包含动态列,因此没有给出显式的列定义,那么CQL在默认情况下分配以下名称:keycolumn1value。在您的例子中,它将有column1包含值“name”,value列将包含“TiTi”等

    就这样想吧。数据实际上存储为键值对。CQL无法从这些键值对推断出任何列名,因为同一行中可能有数十亿个不同的键(列名)

    下面是一个将节约表迁移到cql的好指南:http://www.datastax.com/dev/blog/thrift-to-cql3

  2. # 2 楼答案

    听起来好像您没有在表datatest中定义名为“name”的列。我以前没有使用过Datastax驱动程序,但是正如documentation所说,如果

    name is not part of the ResultSet this row is part of, i.e. if !this.columns().names().contains(name)

    如果您提供了如何创建datatest表,那就更好了

  3. # 3 楼答案

    试试我的情况

    Cluster.Builder builder = Cluster.builder();
    Cluster cluster=builder.withLoadBalancingPolicy(new TokenAwarePolicy(new DCAwareRoundRobinPolicy("us-east"))).addContactPoints("127.0.0.1").build();