我在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
在节俭 API 中没有“IN”类型的查询。您可以对每个复合列值执行一系列 get
查询(day_of_year
、minute_of_day
event_id)
。
如果你的event_id
是连续的(你的问题说它们不是),你可以执行一个单一的get_slice
查询,传递范围(例如,day_of_year
、minute_of_day
和event_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)创建用户