2014-10-16 2 views
0

RIAK에 저장하고있는지도 데이터 유형이 있습니다. 카운터를 포함하는지도가 거의없는지도입니다. 것 JSON 프로그램에 직렬화의 예상 출력 :RIAK - 데이터 유형 - 파이썬에서지도 사용

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

하지만 그 대신 나는 예외를 얻고있다 : "형식 오류 : unhashable 유형 : '지도'". 도움 주셔서 감사합니다. 다음 샘플 코드는 다음과 같습니다

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' 
+1

전체 오류 추적을 제공하십시오! 문제를 진단하는 것이 매우 유용합니다. –

+0

원래 게시물에 추가됨 – Rekr

답변

1

좋아. 나는 그것을 작동 시켰어. RIAK 라이브러리와 설명 사이에 불일치가있는 것 같습니다. map.maps를 반복하는 것은 키가 아니라 값을 반환하는 것입니다. 그러나지도 자체를 반복 할 경우 키/유형 조합을 얻을 수 있습니다. 다음은 작동 코드입니다.

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()