【问题标题】:RIAK - datatypes - map usage in pythonRIAK - 数据类型 - python 中的地图使用
【发布时间】:2014-10-16 07:45:49
【问题描述】:

我得到了存储在 RIAK 中的 Map 数据类型。它是包含少量包含计数器的地图的地图。 序列化为 json 程序的预期输出为:

{
"sample_map_key" : {
    "maps" : {
        "Q1" : {
            "counters" : {
                "a1" : 10,
                "a2" : 13
            }
        },
        "Q2" : {
            "counters" : {
                "a1":31,
                "a2":21,
                "a3":10
            }
        }
    }
}

但是我得到了异常:“TypeError: unhashable type: 'Map'”。 谢谢你的帮助。以下是示例代码:

from riak.datatypes import Map
import riak
def main():
    store_values()
    read_values()

def store_values():
    riak_client = riak.RiakClient(host="localhost", http_port="8087", protocol="pbc")
    mapBucketType = riak.BucketType(riak_client, "maps")
    maps_bucket = riak.RiakBucket(riak_client, "sample_maps_bucket", mapBucketType)
    sample_map = Map(maps_bucket, "sample_map_key")
    sample_map.maps["Q1"].counters["a1"].increment(10)
    sample_map.maps["Q1"].counters["a2"].increment(13)
    sample_map.maps["Q2"].counters["a1"].increment(31)
    sample_map.maps["Q2"].counters["a2"].increment(21)
    sample_map.maps["Q2"].counters["a3"].increment(10)
    sample_map.store()

def read_values():
    riak_client = riak.RiakClient(host="localhost", http_port="8087", protocol="pbc")
    mapBucketType = riak.BucketType(riak_client, "maps")
    maps_bucket = riak.RiakBucket(riak_client, "sample_maps_bucket", mapBucketType)
    sample_map = Map(maps_bucket, "sample_map_key")
    sample_map.reload()
    results = {"sample_map_key": to_json(sample_map)}
    print results

def to_json(map):
        obj = {}
        for m in map.maps:
            if "maps" not in obj:
                obj["maps"] = {}
            obj["maps"][m] = to_json(map.maps[m])
        for c in map.counters:
            if "counters" not in obj:
                obj["counters"] = {}
            obj["counters"][c] = map.counters[c]
        return obj

if __name__ == '__main__':
    main()

完整的追溯:

Traceback (most recent call last):   File "sampleMap.py", line 48, in <module>
    main()   File "sampleMap.py", line 5, in main
    read_values()   File "sampleMap.py", line 31, in read_values
    results = {"sample_map_key": to_json(sample_map)}   File "sampleMap.py", line 40, in to_json
    obj["maps"][m] = to_json(map.maps[m])   File "/usr/local/lib/python2.7/dist-packages/riak/datatypes/map.py", line 26, in __getitem__
    return self.map[(key, self.datatype)]   File "/usr/local/lib/python2.7/dist-packages/riak/datatypes/map.py", line 171, in __getitem__
    if key in self._value: TypeError: unhashable type: 'Map'

【问题讨论】:

  • 请提供完整的错误回溯!诊断问题非常有用。
  • 添加到原帖

标签: python types mapping riak


【解决方案1】:

好的。我让它工作了。看来 RIAK 库和描述之间存在不一致。遍历 map.maps 不是产生键而是产生值。但是,如果您遍历 map 本身,您将获得 key/type touple。以下是工作代码:

from riak.datatypes import Map
import riak
def main():
    store_values()
    read_values()

def store_values():
    riak_client = riak.RiakClient(host="localhost", http_port="8087", protocol="pbc")
    mapBucketType = riak.BucketType(riak_client, "maps")
    maps_bucket = riak.RiakBucket(riak_client, "sample_maps_bucket", mapBucketType)
    sample_map = Map(maps_bucket, "sample_map_key")
    sample_map.maps["Q1"].counters["a1"].increment(10)
    sample_map.maps["Q1"].counters["a2"].increment(13)
    sample_map.maps["Q2"].counters["a1"].increment(31)
    sample_map.maps["Q2"].counters["a2"].increment(21)
    sample_map.maps["Q2"].counters["a3"].increment(10)
    sample_map.store()

def read_values():
    riak_client = riak.RiakClient(host="localhost", http_port="8087", protocol="pbc")
    mapBucketType = riak.BucketType(riak_client, "maps")
    maps_bucket = riak.RiakBucket(riak_client, "sample_maps_bucket", mapBucketType)
    sample_map = Map(maps_bucket, "sample_map_key")
    sample_map.reload()
    results = {"sample_map_key": to_json(sample_map)}
    print results

def to_json(map):
        obj = {}
        for m, type in map:
            if (type == "map"):
                if "maps" not in obj:
                    obj["maps"] = {}
                obj["maps"][m] = to_json(map.maps[m])

            if (type == "counter"):
                if "counters" not in obj:
                    obj["counters"] = {}
                obj["counters"][m] = map.counters[m].value
        return obj

if __name__ == '__main__':
    main()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 2015-05-28
    • 2023-04-09
    相关资源
    最近更新 更多