我尝试使用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)
这是我的数据库:
答案 0 :(得分:3)
听起来您没有在表datatest中定义名称为“name”的列。我之前没有使用过Datastax驱动程序,但正如documentation所说,如果
,则抛出 IllegalArgumentExceptionname不是此行所属的ResultSet的一部分,即if this.columns()。names()。contains(name)
如果您提供了创建数据表的方式,那就更好了。
答案 1 :(得分:2)
当您使用包含动态列的thrift创建表,因此没有给出明确的列定义时,默认情况下CQL会分配以下名称:key
,column1
,{{1} }。在您的情况下,value
包含值“name”,column1
列将包含“TiTi”等。
把它想象成这样。数据实际上存储为键值对。 CQL无法从这些键值对中推断出任何列名,因为同一行中可能有数十亿个不同的键(列名)。
以下是将thrift表迁移到cql的好指南:http://www.datastax.com/dev/blog/thrift-to-cql3
答案 2 :(得分:1)
在我的案例中尝试这项工作
Cluster.Builder builder = Cluster.builder();
Cluster cluster=builder.withLoadBalancingPolicy(new TokenAwarePolicy(new DCAwareRoundRobinPolicy("us-east"))).addContactPoints("127.0.0.1").build();