将Python dict序列化为Cassandra 1.2列

时间:2013-05-12 19:15:24

标签: python cassandra

问题

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

该对象是一个Python词典:

obj = {'id':'sometextid',
       'time_created':05/12/2013, #<---- datetime
       'some other string property': 'some other value'
}

错误是这样的:

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

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

部分腌制对象

cdatetime
datetime
p4
(S'\x07\xdd\x03\x1c\x000\x13\x05\xd0<'
tRp5

我的问题

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

提前致谢!

2 个答案:

答案 0 :(得分:2)

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

obj_to_store = cPickle.dumps(input_obj).encode("hex")

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

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

希望它有所帮助!

答案 1 :(得分:1)

听起来像是CQL库正确解析字符串的问题。在修复之前,一种方法是使用struct将pickle转换为打包字符串。

或者,您可以使用类似urllib

的内容更改违规值的编码