【问题标题】:How to insert value into Column Family using java/astyanax?如何使用 java/astyanax 将值插入列族?
【发布时间】:2014-10-21 18:04:30
【问题描述】:

[已解决] -

我不知道为什么,但删除

m.withRow(CF_test, "acct1234")
   .incrementCounterColumn("loginCount", 1); 

我的部分代码使它工作。或者,如果有人可以解释为什么这样做,那将不胜感激。谢谢!


我在使用 Astyanax for Cassandra-cli 时遇到了问题。我无法从 Netflix Github 网站上了解多少,所以我想问问有更多第一手经验的人。

如何将行插入到我已经在 Cassandra 中创建的列族中?目前,我的代码如下所示:

// Inserting data
MutationBatch m = keyspace.prepareMutationBatch();


//Initialize Column family
ColumnFamily<String, String> CF_test =
new ColumnFamily<String, String>(
"users",              // Column Family Name
StringSerializer.get(),   // Key Serializer
StringSerializer.get());  // Column Serializer


m.withRow(CF_test, "default")
  .putColumn("full_name", "john", null)
  .putColumn("email", "smith", null)
  .putColumn("state", "555 Elm St", null)
  .putColumn("gender", "Male", null)
  .putColumn("birth_year", 30, null);

m.withRow(CF_test, "acct1234")
  .incrementCounterColumn("loginCount", 1);


  OperationResult<Void> result = m.execute();

但是,它给了我以下错误:

Exception in thread "main" com.netflix.astyanax.connectionpool.exceptions.BadRequestException: BadRequestException: [host=127.0.0.1(127.0.0.1):9160, latency=55(55), attempts=1]InvalidRequestException(why:invalid operation for non commutative columnfamily users)
at com.netflix.astyanax.thrift.ThriftConverter.ToConnectionPoolException(ThriftConverter.java:159)
at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:65)
at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:28)
at com.netflix.astyanax.thrift.ThriftSyncConnectionFactoryImpl$ThriftConnection.execute(ThriftSyncConnectionFactoryImpl.java:151)
at com.netflix.astyanax.connectionpool.impl.AbstractExecuteWithFailoverImpl.tryOperation(AbstractExecuteWithFailoverImpl.java:69)
at com.netflix.astyanax.connectionpool.impl.AbstractHostPartitionConnectionPool.executeWithFailover(AbstractHostPartitionConnectionPool.java:256)
at com.netflix.astyanax.thrift.ThriftKeyspaceImpl.executeOperation(ThriftKeyspaceImpl.java:485)
at com.netflix.astyanax.thrift.ThriftKeyspaceImpl.access$000(ThriftKeyspaceImpl.java:79)
at com.netflix.astyanax.thrift.ThriftKeyspaceImpl$1.execute(ThriftKeyspaceImpl.java:123)
at Test1.main(Test1.java:76)

Caused by: InvalidRequestException(why:invalid operation for non commutative columnfamily users)
at org.apache.cassandra.thrift.Cassandra$batch_mutate_result.read(Cassandra.java:20833)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
at org.apache.cassandra.thrift.Cassandra$Client.recv_batch_mutate(Cassandra.java:964)
at org.apache.cassandra.thrift.Cassandra$Client.batch_mutate(Cassandra.java:950)
at com.netflix.astyanax.thrift.ThriftKeyspaceImpl$1$1.internalExecute(ThriftKeyspaceImpl.java:129)
at com.netflix.astyanax.thrift.ThriftKeyspaceImpl$1$1.internalExecute(ThriftKeyspaceImpl.java:126)
at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:60)
... 8 more

创建键空间有效,现在我无法更改列族。

【问题讨论】:

  • 你的列族默认验证器是什么?
  • @SotiriosDelimanolis 验证类是 UTF8Type,你是这个意思吗?我不太熟悉默认验证器是什么。
  • 请不要编辑您的问题以添加“已解决”或“已修复”。如果您自己找到了答案,将其添加为答案。 Stack Overflow 允许你接受它(尽管对于声誉低的成员有很短的等待期)。

标签: java cassandra astyanax


【解决方案1】:

使用

m.withRow(CF_test, "acct1234").incrementCounterColumn("loginCount", 1);

(计数器),

您必须定义一个列族(或超列族),其 列将充当计数器。

默认验证类必须设置为CounterColumnType

CounterColumnType 只能在 default_validation_class 中设置。一种 列族要么只包含计数器,要么根本不包含计数器。

看看this page 指的是this page

【讨论】:

    【解决方案2】:

    我不知道为什么,但删除

    m.withRow(CF_test, "acct1234")
       .incrementCounterColumn("loginCount", 1); 
    

    我的部分代码使它工作。或者,如果有人可以解释为什么这样做,那将不胜感激。谢谢!

    【讨论】:

      猜你喜欢
      • 2014-03-09
      • 2014-09-20
      • 2014-05-05
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 2012-06-26
      相关资源
      最近更新 更多