【问题标题】:Cassandra data-model to perform column sorting?Cassandra 数据模型执行列排序?
【发布时间】:2015-12-30 06:28:57
【问题描述】:

我正在开发的音乐服务应用程序有以下用例(后端 cassandra)。

我的音乐数据存储将包含艺术家、流派、年份、歌曲名称、观看次数、曲目长度、字节编码内容。我希望能够按艺术家过滤;艺术家和流派;艺术家、流派和年份。我还希望歌曲名称显示为按观看次数降序排列。

我有下表:

MusicStore (
  artist text,
  genre text,  
  year text,
  songName text,
  views bigint
  tracklenght bigint,
  content text,

  PRIMARY KEY ((artist), genre, year, views, songName))
  WITH CLUSTERING ORDER BY (year DESC, views DESC, songName ASC);

我遇到的直接问题:

在我允许按艺术家和流派搜索的应用中:

select * from MusicStore  where artist='alizee' AND genre='pop' order by views

此查询不起作用。它说“Orderby 目前仅支持按照主键中声明的顺序对列进行排序”。

似乎 orderby 只允许在第一个集群键上。我缺少什么吗?

对于几个用例来说,非规范化是可能的,但我的应用程序在按流派和年份搜索艺术家时会遇到同样的问题,因为 Cassandra 要求 where 子句键出现在主键中并且与查询的顺序相同(流派,然后是年份)和视图列是第一个聚类键是不可能的。使视图成为第一个集群键将要求其他所有内容都是分区键,因此在 where 子句中是强制性的。

对数据模型有什么建议吗?无论如何我可以通过使用thrift API使用列族(带有超列)来避免这种情况吗?

【问题讨论】:

    标签: database jdbc cassandra data-modeling


    【解决方案1】:

    从左到右应用聚类键 - 如果您在 WHERE 中提供艺术家和流派,您可以按年份排序(升序、降序、相等或不等式 - >、=、

    如果您还提供年份,则可以按视图排序(升序、降序、相等或不等)。

    您不想使用超级列,而且对于大多数用户来说,thrift API 更难理解。那里没有简单的魔法,排序就是这样(基于 sstable 格式),thrift 也受到同样的限制。

    【讨论】:

    • 感谢您的回答。为了满足我的用例按流派和年份过滤(并按视图排序),是否有任何替代数据模型方法?我认为非规范化在这里无济于事,因为对于 where 子句查询,我必须以正确的顺序使用集群键。
    • 在我看来,任何数据库引擎都应该支持的一个非常微不足道的功能(能够对列进行排序)。来自 RDBMS 世界,cassandra 似乎缺乏这个基本功能,或者我只是在我的数据模型中遗漏了一些东西?
    • Cassandra 不是 RDBMS。 Cassandra 专为您可能拥有一千台服务器的用例而设计,每台服务器都可能保存 TB 级的数据。为了达到这个规模,它做出了牺牲——你不能随意对任何你想要的字段进行排序。它允许您对集群键进行排序,因为集群键决定了每个单元在磁盘上的写入顺序。然后,排序变成了对磁盘上该区域的开始(或结束)的搜索,并朝着读取的方向前进。如果您想在不限制年份的情况下对视图进行排序,您将跳过数十个或数百个文件
    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 2013-04-17
    • 2013-07-13
    • 2018-06-26
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    相关资源
    最近更新 更多