我有一个像这样设置的表:
{"String" : {uuid1 : "String", uuid1: "String"}, "String" : {uuid : "String"}}
或者...
Row_validation_class = UTF8Type
Default_validation_class = UTF8Type
Comparator = UUID
(它基本上将网站作为行标签,并基于 datetime.datetime.now() 在 Cassandra 中使用 TimeUUIDType 和字符串作为值动态生成列)
我希望使用 Pycassa 根据行和列检索数据切片。但是,在其他(较小的)表上,我已经这样做了,但是通过下载整个数据集(或至少过滤到一行)然后有一个有序的字典,我可以与 datetime 对象进行比较。
我希望能够使用 Pycassa multiget 或 get_indexed_slice 函数来提取某些列和行。是否存在允许过滤日期时间的类似内容。我当前的所有尝试都会导致以下错误消息:
TypeError: can't compare datetime.datetime to UUID
到目前为止,我设法想出的最好的方法是......
def get_number_of_visitors(site, start_date, end_date=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S:%f")):
pool = ConnectionPool('Logs', timeout = 2)
col_fam = ColumnFamily(pool, 'sessions')
result = col_fam.get(site)
number_of_views = [(k,v) for k,v in col_fam.get(site).items() if get_posixtime(k) > datetime.datetime.strptime(str(start_date), "%Y-%m-%d %H:%M:%S:%f") and get_posixtime(k) < datetime.datetime.strptime(str(end_date), "%Y-%m-%d %H:%M:%S:%f")]
total_unique_sessions = len(number_of_views)
return total_unique_sessions
将 get_posixtime 定义为:
def get_posixtime(uuid1):
assert uuid1.version == 1, ValueError('only applies to type 1')
t = uuid1.time
t = (t - 0x01b21dd213814000L)
t = t / 1e7
return datetime.datetime.fromtimestamp(t)
这似乎不起作用(没有返回我期望的数据)并且感觉它不应该是必要的。我正在使用以下方法创建列时间戳:
timestamp = datetime.datetime.now()
有人有什么想法吗?感觉这是 Pycassa(或其他 python 库)支持的那种东西,但我不知道该怎么做。
cqlsh 描述的 ps 表模式:
CREATE COLUMNFAMILY sessions (
KEY text PRIMARY KEY
) WITH
comment='' AND
comparator='TimeUUIDType' AND
row_cache_provider='ConcurrentLinkedHashCacheProvider' AND
key_cache_size=200000.000000 AND
row_cache_size=0.000000 AND
read_repair_chance=1.000000 AND
gc_grace_seconds=864000 AND
default_validation=text AND
min_compaction_threshold=4 AND
max_compaction_threshold=32 AND
row_cache_save_period_in_seconds=0 AND
key_cache_save_period_in_seconds=14400 AND
replicate_on_write=True;
ps
我知道您可以在 Pycassa 中指定一个列范围,但我无法保证该范围的开始值和结束值对每一行都有条目,因此该列可能不存在。