将Python dict序列化为Cassandra 1.2列

Ser*_*rán 5 python cassandra

问题

我正在尝试将序列化对象(使用cPickle)保存到Cassandra 1.2列中,我正在使用python cql库.我已经尝试将列定义为文本(utf8字符串)和blob,在这两种情况下我都收到相同的错误:

该对象是一个Python字典:

obj = {'id':'sometextid',
       'time_created':05/12/2013, #<---- datetime
       'some other string property': 'some other value'
}
Run Code Online (Sandbox Code Playgroud)

错误是这样的:

raise cql.ProgrammingError("Bad Request: %s" % ire.why)
cql.apivalues.ProgrammingError: Bad Request: line 31:36 no viable alternative at character '\'
Run Code Online (Sandbox Code Playgroud)

看看执行的CQL语句,我可以在pickle对象后看到一些'\'字符,例如:

部分腌渍物体

cdatetime
datetime
p4
(S'\x07\xdd\x03\x1c\x000\x13\x05\xd0<'
tRp5
Run Code Online (Sandbox Code Playgroud)

我的问题

序列化python dict(包括日期时间)以使用cql库将其保存到cassandra 1.2中的常用方法是什么?这样做有更好或更直接的方法吗?

提前致谢!

Ser*_*rán 3

此问题的完整解决方案是将列定义为 blob 并包含十六进制编码(如 blob 类型的 cassandra 文档中所定义):

obj_to_store = cPickle.dumps(input_obj).encode("hex")
Run Code Online (Sandbox Code Playgroud)

通过这种方式,你可以序列化一个常规的 python 字典。对于常规,我的意思是它可以包含 python 字典可以包含的任何内容,包括日期时间或任何你想要的内容,并且它将被正确序列化并存储在 cassandra 中。

也许有更好的解决方案,但到目前为止,这是我发现的唯一一个实际上适用于任意 python 字典的解决方案。

希望它对某人有帮助!