我面临一个问题,该问题将一些数字值插入复合列(Cassandra 1.1.6使用astyanax 1.0.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)
;
dailpersonal定义为:
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)
我看不到它失败的任何明显原因。有人可以告诉我的代码是否正确还是有任何环境/库问题?
我刚刚遇到了同一问题。使用不是复合列的动态列,如果您使用正确的MutationBatch PutColumn方法为数据使用,则将使用正确的验证器。但是,无论您选择的突变batch putcolumn方法如何,都将使用列族的默认验证类。
。在我看来,这是不一致的。但是,有两个解决方法。首先是简单地将列家族中的默认验证类设置为将存储在复合列中的数据类型。根据您发布的输出,我认为它当前是UTF8Type,您正在尝试存储整数。
第二解决方法是集合到字节型的默认验证类。这将允许存储任何数据类型,并且是我首选的解决方案。该解决方案还使您可以在同一行中拥有多个复合列,以存储不同的值类型。
请查看Github上的以下Wiki页面,以获取有关如何将CQL3与Astyanax一起使用的示例。https://github.com/netflix/astyanax/wiki/cql-and-cql3。