当前位置: 首页 > 知识库问答 >
问题:

Cassandra-用于查询整个分区的IN或TOKEN查询?

张华池
2023-03-14

我想查询表的完整分区。我的复合分区键由(id,date,hour_of_timestamp)组成iddate是字符串,hour_of_timestamp是整数。

我需要将hour_of_timestamp字段添加到我的分区键,因为在摄取数据时存在热点。

现在我想知道查询数据的完整分区的最有效方法是什么?根据这个博客,使用SELECT*from mytable WHERE id='x'AND date='10-10-2016'ANDhour_of_timestampIN(0,1,…23);会在协调器节点上造成大量开销。

使用TOKEN函数并用两个TOKEN查询分区是否更好?如<代码> SELECT * from my table WHERE TOKEN(id,date,hour_of_timestamp)

所以我的问题是:我应该使用INTOKEN查询来查询我的数据的整个分区吗?还是我应该使用23个查询(每个hour_of_timestamp的值一个),然后让驱动程序做剩下的事情?

我正在使用Cassandra 3.0.8和最新的Datastax Java驱动程序连接到6节点集群

共有1个答案

邰伟彦
2023-03-14

你说:

现在我想知道查询数据的完整分区的最有效方法是什么?根据此博客,使用来自 mytable 的 SELECT * ID = 'x' 和日期 = '10-10-2016' 并且hour_of_timestamp IN (0,1,...23);在协调器节点上造成大量开销。

但实际上你会查询24个分区。

您可能的意思是,您的设计中,单个分区现在由24个分区组成,因为您在数据摄取过程中添加了小时以避免热点。注意到在两个模型(具有热点的旧模型和这个新模型)中,数据仍然按时间戳排序,您有两个选择:

    < li >一次运行一个查询。 < li >第一次运行2个查询,然后一次运行一个以“预取”结果。 < li >并行运行24个查询。

案例1

如果您按顺序处理数据,第一个选择是运行小时0的查询,处理数据,完成后,运行小时1的查询,依此类推…这是一个简单的实现,我认为它不应该得到更多。

案例 2

如果您的查询花费的时间超过数据处理时间,则可以“预取”一些数据。因此,第一次可以并行运行 2 个查询来获取小时 0 和 1 的数据,并开始处理小时 0 的数据。同时,第 1 小时的数据到达,因此,当您完成对小时 0 的数据处理完毕后,您可以预取第 2 小时的数据,并开始处理小时 1 的数据。等等.通过这种方式,您可以加快数据处理速度。当然,根据您的时间(数据处理和查询时间),您应该优化“预取”查询的数量。

另请注意,Java驱动程序会自动为您分页,根据检索到的分区的大小,您可能希望禁用该功能以避免阻塞数据处理,或者可能希望通过类似下面的方式抢先获取更多数据:

ResultSet rs = session.execute("your query");
for (Row row : rs) {
    if (rs.getAvailableWithoutFetching() == 100 && !rs.isFullyFetched())
        rs.fetchMoreResults(); // this is asynchronous
    // Process the row ...
}

您可以在其中调整 rs.get 可用不取物() == 100 以更好地满足您的预取要求。

您可能还希望第一次预取多个分区,以便确保您的处理不会等待任何数据提取部分。

案例3

如果您需要一起处理来自不同分区的数据,例如需要第3小时和第6小时的数据,那么您可以尝试按“依赖项”对数据进行分组(例如并行查询第3小时和第6小时)。

如果您需要所有这些,那么应该并行运行24个查询,然后在应用程序级别连接它们(您已经知道为什么应该避免多个分区的in)。请记住,您的数据已经是有序的,因此您的应用程序级别的工作将非常小。

 类似资料:
  • 我正在学习Cassandra,并有一个关于分区/集群键的问题。 我有一个表,存储数据的股份,如行业的分支,最近6/12个月的业绩,名称等。 该表如下所示: 多谢了,伙计们

  • 使用Spark连接器通过分区键查询cassandra的理想方法是什么。我使用传入键,但这导致cassandra在引擎盖下添加,从而导致超时。 当前设置: 这里是分区(不是主)键,我有一个复合主键,只使用分区键进行查询 更新:是的,我得到了一个异常:

  • 我正在使用Cassandra 1.1.2我正在尝试将RDBMS应用程序转换为Cassandra。在我的RDBMS应用程序中,我有以下名为table1的表: Col1:字符串(主键) 此表对2亿记录进行计数。主要使用的查询如下: 在Cassandra中,我使用以下语句创建表: 我将主键更改为一个额外的列(我计算应用程序中的键)。导入一些记录后,我尝试执行以下cql: 这个结果是: 查询从col3=6

  • 本文向大家介绍mySQL中in查询与exists查询的区别小结,包括了mySQL中in查询与exists查询的区别小结的使用技巧和注意事项,需要的朋友参考一下 一、关于exists查询 以上是一个典型的exists查询的sql语句。 它的作用方式是这样的:每次从vendor表中查询出一条数据,然后将这条数据中的vendor_prov_code值传递到exists查询中进行执行,也就是进行子查询的执

  • 问题内容: 我有一个字符串中的ID列表,并且想使用Hibernate来获取具有这些ID的行。是一个Hibernate / JPA实体(对不起,如果我在这里混淆了命名)。 我的代码是: 但这失败了: 如何使零件工作?谢谢。 问题答案: JPQL查询的语法不正确。两种使用(带有位置参数): 或(使用命名参数): 以下是JPA 1.0规范中有关参数的相关部分: 4.6.4.1位置参数 以下规则适用于位置