将Python dict序列化为Cassandra 1.2列

将Python dict序列化为Cassandra 1.2列,python,cassandra,Python,Cassandra,问题 我试图将一个序列化对象(使用cPickle)保存到Cassandra1.2列中,我使用的是python。我已经尝试将列定义为文本(utf8字符串)和blob,在这两种情况下,我都收到了相同的错误: 该对象是一个Python dict: obj = {'id':'sometextid', 'time_created':05/12/2013, #<---- datetime 'some other string property': 'some other v

问题

我试图将一个序列化对象(使用cPickle)保存到Cassandra1.2列中,我使用的是python。我已经尝试将列定义为文本(utf8字符串)和blob,在这两种情况下,我都收到了相同的错误:

该对象是一个Python dict:

obj = {'id':'sometextid',
       'time_created':05/12/2013, #<---- datetime
       'some other string property': 'some other value'
}
查看已执行的CQL语句,我可以在酸洗对象后看到一些“\”字符,例如:

酸洗对象的一部分

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

(S'\x07\xdd\x03\x1c\x000\x13\x05\xd0听起来像是CQL库正确解析字符串的问题。在解决此问题之前,一种方法是使用将pickle转换为压缩字符串


或者,您可以使用类似

的方法更改有问题值的编码。此问题的完整解决方案是将列定义为blob,并通过以下方式包括编码为十六进制(如cassandra文档中针对blob类型的定义):

obj_to_store = cPickle.dumps(input_obj).encode("hex")
通过这种方式,您可以序列化一个常规python dict。使用regular,我的意思是它可以包含python dict可以包含的任何内容,包括日期时间或您想要的任何内容,并且它将被正确序列化并存储在cassandra中

也许有一个更好的解决方案,但到目前为止,这是我发现的唯一一个真正适用于任意python dict的解决方案


希望它能帮助一些人!

我不会给出实际的答案,因为我不熟悉Cassandra。但是你认为它失败是因为它在单引号处停止读取吗?(因为它将它解释为带引号的字符串或其他东西?或者它试图将反斜杠-x解释为控制字符?)如果是这样的话,也许JSON编码或pickle->Base64会更好(因为它们都是具有定义良好的引用规则的文本)。事实上,你离答案不远了,是的,问题可能是CQL库(再次!)
obj_to_store = cPickle.dumps(input_obj).encode("hex")