【问题标题】:cassandra collection map indexingcassandra 集合地图索引
【发布时间】:2018-04-11 01:11:49
【问题描述】:

我有一个 Cassandra 表,它的一列看起来像这样

 "ArticlesViewed" frozen<map<int, frozen<list<int>>>>

   and it contains data like 

       ArticlesViewed
       -----------------------------------------------
       {400: [9, 19, 11, 12], 545: [183, 44, 25, 16, 97]}
       {812: [2, 44, 41, 22], 376: [123, 14, 15, 16, 47]}
       {134: [9, 10, 11, 92], 111: [533, 14, 15, 16, 27]}

我想在此列上创建索引,以(不允许过滤)此列,但不允许我这样做

 cqlsh>CREATE INDEX ON user_profile("ArticlesViewed");

 [Invalid query] message="Cannot create values() index on frozen column ArticlesViewed.
 Frozen collections only support full() indexes"

  Also,i want to query on the <value>  {400: [9, 19, 11, 12],of the column like

 select "ArticlesViewed" from  user_profile where "ArticlesViewed" =19;

请建议我一些方法来做到这一点..任何帮助将不胜感激

【问题讨论】:

    标签: indexing cassandra bigdata cqlsh


    【解决方案1】:

    您不能在冻结的集合元素上创建索引

    您必须在冻结集合上创建完整索引

    在完整的 FROZEN 集合上创建索引。可以在没有现有索引的表的集合、列表或映射列上创建 FULL 索引。

    要索引集合条目,请在嵌套括号中使用 FULL 关键字和集合名称

    例如:

    CREATE INDEX on user_profile(full(articlesviewed));
    

    使用完整索引,如果要查询已查看的文章,则必须指定完整的集合值。因为它被冻结了。

    如果你有数据:

     userid | articlesviewed
    --------+----------------------------------
          1 | {1: [1, 2, 3], 10: [10, 20, 30]}
    

    您的查询应该包含文章浏览的全部价值

    SELECT * FROM user_profile WHERE articlesviewed = {1: [1, 2, 3], 10: [10, 20, 30]};
    

    【讨论】:

    • 谢谢,为已工作的冷冻收藏创建完整索引,我该如何查询 >> 从 user_profile 中选择“ArticlesViewed”,其中“ArticlesViewed”=19;
    • @s.s 你不能这样查询,你必须改变你的数据模型
    • 如果你觉得这个答案有帮助,你可以接受这个答案,这样其他用户也会觉得它有用
    • 谢谢@Ashraful Islam 我改变了数据模型..你能帮我解决这个问题 -> stackoverflow.com/questions/47030798/…
    猜你喜欢
    • 2012-12-17
    • 2015-07-13
    • 2017-12-22
    • 1970-01-01
    • 2011-06-01
    • 2014-08-26
    • 2017-12-15
    • 2018-02-15
    • 2021-09-13
    相关资源
    最近更新 更多