在卡桑德拉(Cassandra)进行分区密钥的联合会表现



假设我们有以下Cassandra表:

create table news(
    date text,
    source text,
    category int,
    id text,
    title text,
    tags text,
    primary key ((date, source, category), id)
)

现在我们需要按日期,类别和来源来支持查找:

select * from news where date in ('2019-01-23', '2019-01-24') and 
category in (1, 4, 6) and source in ('Bloomberg', 'CNN'); 

我被告知,此查询将进行次优于同样,我们将所有分组分为单独的查询,并使用Union加入结果(上面的12个子查询)。原因是联合将被分为12个独立的查询,并且每个查询都可以通过群集中的一个节点(20 节点)进行处理,我们将开始更快地获得结果。如果我们只是想确保返回的行低于某个阈值时,也应该更快的速度:

select count(*) (
    select * from news where date in ('2019-01-23', '2019-01-24') and 
       category in (1, 4, 6) and source in ('Bloomberg', 'CNN') LIMIT 10001
); 

但是,我没有观察到小结果组和大型结果(250k行)的性能提高。我尝试了谷歌搜索,但找不到任何可以支持或证明错误的联盟假设的东西。

我正在使用Spark SQL(Hive 2)和Java CQL驱动程序访问Cassandra中的数据。

我感谢任何有用的信息。

谢谢

几个点,

  1. 如果您始终要在源前进行过滤类别,则更好地将模式更改为((日期,类别,源),ID),因为订单确实很重要。

  2. 性能不仅基于您正在尝试的记录数量,而且它更多地基于呼叫中使用了多少个分区键 - 上面的示例似乎太少了,无法证明性能差异。如果您可以尝试使用更多的分区尝试相同的方案(例如,要过滤50个日期而不是2个日期),那么您可以看到越来越糟。

当您向12个节点的群集发送12个查询时,12个节点可能会独立获取数据并通过协调员将其返回。通过并行查询,这是适当的工作分布。这就是为什么分解查询更快的原因。如果您没有足够的数据或足够的节点,则可能永远不会看到这种差异。

如果分区很大,无论分配方式如何,您仍然可能会得到相同的延迟。不知道数据是什么样子,您拥有多少个分区以及您拥有多少个节点,很难说哪个节点要快, you

>

相关内容

  • 没有找到相关文章

最新更新