如何使用CQL3在Cassandra中创建复杂的结构

时间:2013-11-12 10:38:28

标签: cassandra data-modeling cql cql3

我在cassandra中呈现复杂的数据结构时遇到问题。 JSON数据示例:

{
  "A": {
    "A_ID" : "1111"
    "field1": "value1",
    "field2": "value2",
    "field3": [
      {
        "id": "id1",
        "name": "name1",
        "segment": [
          {
            "segment_id": "segment_id_1",
            "segment_name": "segment_name_1",
            "segment_value": "segment_value_1"
          },
          {
            "segment_id": "segment_id_2",
            "segment_name": "segment_name_2",
            "segment_value": "segment_value_2"
          },
          ...
        ]
      },
      {
        "id": "id2",
        "name": "name2",
        "segment": [
          {
            "segment_id": "segment_id_3",
            "segment_name": "segment_name_3",
            "segment_value": "segment_value_3"
          },
          {
            "segment_id": "segment_id_4",
            "segment_name": "segment_name_4",
            "segment_value": "segment_value_4"
          },
          ...
        ]
      },
      ...
    ]
  }
}

将只使用一个查询:   按A_ID查找。

我认为这些数据应该存储在一个TABLE(列族)中,而不需要序列化/反序列化操作,以提高效率。 如果CQL不支持嵌套地图和列表,我该怎么做?

2 个答案:

答案 0 :(得分:8)

Cassandra 2.1增加了对嵌套结构的支持:https://issues.apache.org/jira/browse/CASSANDRA-5590

“将它存储为json / protobuf / avro / etc blob”的缺点是你必须读取并重写整个blob来更新任何字段。所以至少你应该把你的顶级字段拉到Cassandra列中,并酌情利用collections

答案 1 :(得分:2)

由于您将它作为键/值使用,您实际上可以将其存储为JSON,或者用于更有效地保存数据,例如BSON或事件Protobuf。

我个人会将它存储在Protobuf记录中,因为它不保存可能在您的情况下重复的字段名称。