如何使用Astyanax进行Cassandra CQL查询?

时间:2013-03-07 00:33:35

标签: java nosql cassandra cql astyanax

我正在使用Astyanax版本1.56.26和Cassandra版本1.2.2

好的,有点情况概述:

  1. 我使用cqlsh创建了一个非常简单的列族,如:

    CREATE TABLE users ( name text PRIMARY KEY, age int, weight int );

  2. 我填充了列系列(没有空列)

  3. 通过cqlsh查询users会产生预期结果

  4. 现在我想以编程方式查询users,所以我尝试了类似的内容:

  5. ColumnFamily<String, String> users =  
      new ColumnFamily<String, String>("users", StringSerializer.get(), StringSerializer.get());
    OperationResult<ColumnList<String>> result = ks.prepareQuery(users)
      .getRow("bobbydigital") // valid rowkey
      .execute();
    ColumnList<String> columns = result.getResult();
    int weight = columns.getColumnByName("weight").getIntegerValue();
    
    1. 在分配weight期间,NPE被抛出! :(
    2. 我的理解是result应该包含与包含"bobbydigital"的行相关联的所有列作为其行键。然后,我尝试将名为"weight"的列中的值分配给整数变量weight。我知道变量columns正在分配,因为当我在赋值后立即添加一些调试代码时,就像这样:

      System.out.println("Column names = " + columns.getColumnNames());
      

      我得到以下输出:

      Column names = [, age, weight]

      那么为什么空指针呢?谁能告诉我哪里出错了?另外,为什么有空白列名?

      更新:
      此外,如果我尝试以不同的方式查询,例如:

      Column<String> result = ks.prepareQuery(users)
        .getKey("bobbydigital")
        .getColumn("weight")
        .execute().getResult();
      int x = result.getIntegerValue();
      

      我得到以下例外:
      InvalidRequestException(why:Not enough bytes to read value of component 0)

      提前感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:2)

我弄清楚我做错了什么。我尝试的查询样式对CQL表无效。要使用Astyanax查询CQL表,您需要将.withCQL方法链接到prepareQuery方法;传递CQL语句作为参数。

可以找到特定于使用CQL和Astyanax的信息here

答案 1 :(得分:0)

我通过添加setCqlVersion

来解决这个问题

this.astyanaxContext = new AstyanaxContext.Builder() .forCluster("ClusterName") .forKeyspace(keyspace) .withAstyanaxConfiguration( new AstyanaxConfigurationImpl().setCqlVersion( "3.0.0").setDiscoveryType(

在创建表时添加WITH COMPACT STORAGE