1

複合列 (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)

失敗する明確な理由はわかりません。私のコードが正しいかどうか、または環境/ライブラリに問題があるかどうかを誰かに教えてもらえますか?

4

2 に答える 2

1

私はちょうど同じ問題に遭遇しました。複合列ではない動的列では、データに正しい MutationBatch putColumn メソッドを使用すると、正しいバリデーターが使用されます。ただし、選択した MutationBatch putColumn メソッドに関係なく、複合列では、列ファミリーの既定の検証クラスが使用されます。

私の考えでは、これは一貫していません。ただし、2 つの回避策があります。1 つ目は、列ファミリの既定の検証クラスを、複合列に格納されるデータ型に単純に設定することです。あなたが投稿した出力に基づいて、現在UTF8Typeであり、整数を保存しようとしていると思います。

2 番目の回避策は、デフォルトの検証クラスを BytesType に設定することです。これにより、任意のデータ型を保存できるようになり、私の好みのソリューションです。このソリューションを使用すると、同じ行に複数の複合列を配置して、異なる値の型を格納することもできます。

于 2012-12-20T20:28:53.900 に答える
0

astyanax で CQL3 を使用する方法の例については、github の次の wiki ページを参照してください。 https://github.com/Netflix/astyanax/wiki/Cql-and-cql3 .

于 2012-12-04T09:57:11.807 に答える