使用一列任意长度

时间:2017-02-03 06:29:25

标签: cassandra cassandra-2.0

我正在尝试创建一个适合以下数据的表:

[("US",20150914,(("GOV",7),("POL",9))),("PA",20150914,(("EDU",7),("POL",9),("MON",20))),("US",20150914,(("GOV",7)))]

我创建了下表:

CREATE TABLE gdelt.world_patterns (country varchar, date int, mention tuple <tuple<text, int>,tuple<text, int>,tuple<text, int>>, PRIMARY KEY ( country, date ) );

我的问题是Cassandra只会正确存储长度为3的元组。我可以存储任何长度的元组吗?我不知道怎么写这个。

这是我当前表格的图片: enter image description here

2 个答案:

答案 0 :(得分:1)

CREATE TABLE gdelt.world_patterns (
    country varchar, 
    date int, 
    mention text, ---- Json
PRIMARY KEY ( country, date ) );

将元组值保存为Json字符串,这样您就不必担心元组的数量。

        {"tuple": {
      "country": "us",
      "date": "20150704",
      "mention": 
            [
          {"text": "value"},
          {"text": "value"},
          {"text": "value"},
           ]
    }}

Optionaly你也可以把contry和date放在json中。

答案 1 :(得分:1)

您有多种选择: (以文本形式存储,这是o.k.但我不认为你真的想要它)

使用地图(可能最好,但不知道你是否想要解码)

CDAO{// consider this as class in application X
    public void insert(C obj){
        //do stuff
        anotherApp.insert(obj); // consider this as a method in application Y
    }
}

使用元组列表(只需稍微修改你的东西[]而不是())

CREATE TABLE world_patterns (
    country varchar,
    date int,
    mention map<text, int>,
    PRIMARY KEY ( country, date )
);

INSERT INTO world_patterns(country, date, mention) values ('LA', 20150704, { 'US' : 20150914, 'GOV': 7, 'POL':  9}) ;