1

次のようなスキームがあります。

  • タイムスタンプ
  • デバイスID
  • 装置名
  • デバイス所有者
  • デバイスの場所

CQL を使用してこの列ファミリーを作成し、主キーを として定義しました(TimeStamp,Device ID, Device Name)。DeviceID、名前、およびフィールド名 ( または のいずれDevice Ownerかを格納するDevice Location) のフィールドを持つシリアル化可能なオブジェクトを介して。Astyanax を使用していくつかのレコードを挿入しました。

私の理解によると、行の列は、フィールド名を列名として、その特定のフィールドの値となる値を組み合わせることによって作成されDevice IDますDevice Name。したがって、特定のタイムスタンプとデバイスの場合、列名はパターンになります (Device ID:Device Name: ...)

したがって、これら 2 つのフィールドをプレフィックスとして使用して、特定の時間とデバイスの組み合わせのすべてのエントリを取得できると思います。

次のクエリを使用して結果を取得しています。

  RowSliceQuery<String, ApBaseData> query = adu.keyspace
  .prepareQuery(columnFamily)
  .getKeySlice(timeStamp)
  .withColumnRange(new RangeBuilder()
   .setStart(deviceID+deviceName+"_\u00000")
   .setEnd(deviceID+deviceName+"_\uffff")
   .setLimit(batch_size)
   .build());

しかし、上記のクエリを実行すると、次の例外が発生します。

BadRequestException: [host=localhost(127.0.0.1):9160, latency=6(6), attempts=1]InvalidRequestException(理由: コンポーネント 0 の値を読み取るのに十分なバイト数がありません)

@abhi この列ファミリーで使用できるデータは次のとおりです。

    stime    |  devName  | devId | Owner | Location
  1361260800 | dev:01:02 |   1   | 1234  |    1  
  1361260800 | dev:02:03 |   2   | 34    |    2
  1361260800 | dev:05:06 |   1   | 12    |    1
  1361260800 | dev:03:02 |   2   | 56    |    3

これに使用している Java シリアライズ可能な Java クラスは次のとおりです。

public class BaseData implements Serializable {
    private static final long serialVersionUID = 1L;
    @Component(ordinal = 0)
    private String devName;
    @Component(ordinal = 1)
    private int devID;
    @Component(ordinal = 2)
    private String field;
}

上記のクラスの構造に従って、列ファミリーの列を次のように見ることができます: Columne Name: dev\:01\:02:1:location Column Value: 00000001

astyanax 1.56.31を使用した参考までに

4

3 に答える 3

1


1. デバイス ID に「:」を使用しています。これは、Cassandra でも複合列に使用されます。したがって、可能であれば使用しないでください。
2. 列名は「dev\:01\:02:1:location」と表示されます。これは、テスト データによると、devicename+deviceid+location です。ただし、クエリで deviceID+deviceName+"_\u00000" を指定していますか??

于 2013-04-03T12:53:05.757 に答える