我在使用复合列(使用Astyanax 1.0.6客户端的Cassandra 1.1.6)将一些数值插入列族时遇到问题。
AnnotatedCompositeSerializer<DailyPersonal> dailyPersonalSerializer
= new AnnotatedCompositeSerializer<DailyPersonal>(DailyPersonal.class);
ColumnFamily<Long, DailyPersonal> CF_DAILY_PERSONAL
= new ColumnFamily<Long, DailyPersonal>("daily_personal",
LongSerializer.get(), dailyPersonalSerializer);
DailyPersonal dailyPersonalSteps = new DailyPersonal(new LocalDate(2012, 1, 1).toDate(), 12348L, "steps");
DailyPersonal dailyPersonalDistance = new DailyPersonal(new LocalDate(2012, 1, 1).toDate(), 12348L, "distance");
MutationBatch m = keyspace.prepareMutationBatch();
m.withRow(CF_DAILY_PERSONAL, 1L)
.putColumn(dailyPersonalSteps, 333, null)
;
m.withRow(CF_DAILY_PERSONAL, 1L)
.putColumn(dailyPersonalDistance, 444, null)
;
DailyPersonal定义为:
public class DailyPersonal {
@Component(ordinal = 0)
private Date logDate;
@Component(ordinal = 1)
private Long userId;
@Component(ordinal = 2)
private String field;
...
}
列族定义:
CREATE TABLE daily_personal (
program_id bigint,
log_date timestamp,
user_id bigint,
distance int,
steps int,
PRIMARY KEY (program_id, log_date, user_id)
);
在插入一些值时会出现问题:即444失败,而333正常工作。我无法计算依赖关系,但看起来它失败了许多值[0; 1500]。错误消息如下所示:
com.netflix.astyanax.connectionpool.exceptions.BadRequestException: BadRequestException: [host=127.0.0.1(127.0.0.1):9160, latency=19(40), attempts=1] InvalidRequestException(why:(String didn't validate.) [demodb][daily_personal][2012-01-01 00:00:00+0300:12348:distance] failed validation)
我没有看到任何明显的失败原因。有人可以告诉我的代码是否正确或是否有任何环境/库问题?
答案 0 :(得分:1)
我遇到了同样的问题。如果对数据使用正确的MutationBatch putColumn方法,则使用非复合列的动态列,将使用正确的验证程序。但是,对于复合列而不管您选择的MutationBatch putColumn方法,将使用列族的默认验证类。
在我看来,这并不一致。但是,有两种解决方法。第一种方法是简单地将列族中的默认验证类设置为将存储在复合列中的数据类型。根据您发布的输出,我会假设它当前是UTF8Type,并且您正在尝试存储整数。
第二种解决方法是将默认验证类设置为BytesType。这将允许存储任何数据类型,这是我的首选解决方案。此解决方案还允许您在同一行中存储多个复合列,以存储不同的值类型。
答案 1 :(得分:0)
请查看github上的以下wiki页面,了解如何将CQL3与astyanax一起使用。 https://github.com/Netflix/astyanax/wiki/Cql-and-cql3。