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

复合柱和卡桑德拉中的“IN”关系

谯德元
2023-03-14

我在Cassandra中有以下列系列,用于将时间序列数据存储在少量非常“宽”的行中:

CREATE TABLE data_bucket (
  day_of_year int,
  minute_of_day int,
  event_id int,
  data ascii,
  PRIMARY KEY (data_of_year, minute_of_day, event_id)
)

在CQL外壳上,我能够运行如下查询:

select * from data_bucket where day_of_year = 266 and minute_of_day = 244 
  and event_id in (4, 7, 11, 1990, 3433)

从本质上讲,我修复了复合列名称的第一个组成部分的值(minute_of_day),并希望根据第二个组成部分的不同值(event_id)选择一组不连续的列。由于“IN”关系被解释为相等关系,因此这工作正常。

现在我的问题是,我如何在没有CQL的情况下以编程方式完成相同类型的复合列切片。到目前为止,我已经尝试了Python客户端pycassa和Java客户端Astyanax,但没有任何成功。

任何想法都值得欢迎。

编辑:

我正在添加通过卡桑德拉-cli看到的列系列的描述输出。由于我正在寻找一个基于节俭的解决方案,也许这会有所帮助。

ColumnFamily: data_bucket
  Key Validation Class: org.apache.cassandra.db.marshal.Int32Type
  Default column value validator: org.apache.cassandra.db.marshal.AsciiType
  Cells sorted by: org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.Int32Type,org.apache.cassandra.db.marshal.Int32Type)
  GC grace seconds: 864000
  Compaction min/max thresholds: 4/32
  Read repair chance: 0.1
  DC Local Read repair chance: 0.0
  Populate IO Cache on flush: false
  Replicate on write: true
  Caching: KEYS_ONLY
  Bloom Filter FP chance: default
  Built indexes: []
  Compaction Strategy: org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy
  Compression Options:
    sstable_compression: org.apache.cassandra.io.compress.SnappyCompressor

共有1个答案

瞿博易
2023-03-14

在节俭 API 中没有“IN”类型的查询。您可以对每个复合列值执行一系列 get 查询(day_of_yearminute_of_day event_id)

如果你的event_id是连续的(你的问题说它们不是),你可以执行一个单一的get_slice查询,传递范围(例如,day_of_yearminute_of_dayevent_id的范围)。你可以用这种方式获取它们的束,并自己以编程方式过滤响应(例如,获取事件ID在4-3433之间的日期的所有数据)。更多的数据搬迁,更多的客户端处理,所以除非你真的在寻找一个范围,否则不是一个好的选择。

因此,如果你想在Cassandra中使用“IN ”,你需要切换到基于CQL的解决方案。如果你考虑在python中使用CQL,另一个选择是cassandra-dbapi2。这对我很有效:

import cql

# Replace settings as appropriate
host = 'localhost'
port = 9160
keyspace = 'keyspace_name'

# Connect
connection = cql.connect(host, port, keyspace, cql_version='3.0.1')
cursor = connection.cursor()
print "connected!"

# Execute CQL
cursor.execute("select * from data_bucket where day_of_year = 266 and minute_of_day = 244 and event_id in (4, 7, 11, 1990, 3433)")
for row in cursor:
  print str(row) # Do something with your data

# Shut the connection
cursor.close()
connection.close()

(用Cassandra 2.0.1测试。)

 类似资料:
  • 以CQL为例选择如下: 给定ID是一个分区键,使用IN关系比执行多个查询更好,还是没有区别?

  • 我们一直在使用Spark RDD API(Spark 2.0)来处理在Cassandra.Note中建模的数据,这些数据在Cassandra中建模以实现高效的读写。 然而,现在还有SparkSQLAPI,Spark DataFrame API,它也是一种替代的数据访问方法-http://spark.apache.org/docs/latest/sql-programming-guide.html

  • Cassandra修复无法在节点1上运行,出现以下错误。我之前错误地并行启动了多个修复会话。我发现有一个错误https://issues.apache.org/jira/browse/CASSANDRA-11824已经解决了同样的情况。但我已经在使用cassandra 3.9,请确认运行nodetool scrub是否是唯一的解决方法?在运行scrub之前,我们需要记住什么注意事项,因为我需要直接

  • 下面给出了3个表的CQL。两者具有相同的列结构,但在设置主键方面有所不同。 表1:没有复合主键 哪些设计具有更好的读/写性能?

  • 我使用的是spring数据cassandra,需要使用jpa映射一个字段,在cassandra中,该字段的类型为

  • 我们运行的cassandra集群有3个节点,复制因子为2。 我们的nodejs服务器是查询这个集群的唯一地方。 是否有其他任何地方的参数设置可能导致不一致的查询? cassandra v2.2.4 nodejs驱动程序v3.0.0 编辑-添加我正在做的事情的示例: 1)检查用户名是否被占用 2)创建用户