我从卡桑德拉的jmx那里得到了一些数据。其中一个元素的定义如下。https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java#L358
Java中返回的类型是int[];
import xml.etree.ElementTree as xml
text = requests.get('http://:8081/mbean?objectname=org.apache.cassandra.db:type=xxx,keyspace=x,columnfamily=x&template=identity').text
x = xml.fromstring(text)
>>> for i in x:
... if i.get('name') == 'SSTableCountPerLevel':
... p=i
>>> p.items()
[('description', 'Attribute exposed for management'), ('aggregation', 'array'), ('value', '[I@48a6ea00'), ('isnull', 'false'), ('strinit', 'false'), ('type', '[I'), ('availability', 'RO'), ('name', 'SSTableCountPerLevel')]
>>> p.get('value')
'[I@48a6ea00'那么,如何将这个[I@48a6ea00 ]转换为python中的int列表呢?
@更新1:
似乎JPY正是为此目的而来的,但由于缺乏文件,我将尝试这一点,并在不久的将来提供一个更新。
>>> import jpyutil
>>> jpyutil.init_jvm(jvm_maxmem='512M')
>>> import jpy
>>> b = jpy.array('int', [1,2,3])
>>> b.toString()
'[I@3f2a09d5'
>>> b
[I(objectRef=0x7fa66340dfe8)
>>> b[0]
1L
>>> b[2]
3L
>>> dir(b)
['__class__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__jinit__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'equals', 'getClass', 'hashCode', 'notify', 'notifyAll', 'toString', 'wait']但是我仍然不能将字符串转换为Python列表,这就是我想要的。
@结论:
如果python知道Java数组的内容,那么应该可以在python代码中解码java int数组,但在上述情况下,[i@48a6e00不是java int数组的内容,而是对java int数组的内存引用,因此这是不可能的。
我通过MX4J获得了这个字符串,我将检查MX4J文档以查看MX4j处理数组的方式。
@更新2:
在检查了MX4J冲洗之后,它被明确地声明为
Obviously it has some limitations, like not being able to manipulate data which cannot be obtained from Strings最后,我使用了JYTHON,很好地解决了我的问题。
发布于 2015-01-06 10:20:55
该值似乎在某个地方不正确地转换为对数组( int[] )的引用。你能打印原稿吗?即文本和xml,即x检查哪一步出错。
所以问题是原始响应只返回数组的内部描述符,‘[i@48a6e00’是int数组的引用,它是类型@address格式,只有在特定JVM中才有意义,它没有携带实际值信息。也就是说,无法获得值,因为它已经在响应中丢失了。
发布于 2015-01-06 10:30:29
如果您将字符串 '[I@48a6ea00'作为响应,那么将这个int[]数据类型写入数据库的那个人做了一些错误的事情。因此,对于python或cassandra来说,拯救原始数据为时已晚。
https://stackoverflow.com/questions/27795894
复制相似问题