2016-09-18 97 views
0

我有这样的格式上了Riak数据库数据:的MapReduce在了Riak千伏使用JavaScript

Bakshi - {u'friendlist': [u'Sita', u' Hari', u' Shyam', u' Howard', u' Bindu', u' Kishna', u' Karma', u' Dinesh'], u'is_active': True, u'user': u'Bakshi'} 

这里fethcing数据通过的Map/Reduce

client = riak.RiakClient() 
user_bucket = client.add('userfriendlist') 

user_bucket.map(""" 
     function(v){ 
      var data = JSON.parse(v.values[0].data); 
      if(data.is_active == true){ 
       tempUser = data.user; 
       tempFriendlist = data.friendlist; 
       for (var i=0; i<tempFriendlist.length; i++){ 
        friendValue = tempFriendlist[i];          
        return [[tempUser,friendValue]]; 

       }   
      } 
     } 

     """) 

并打印返回值

for result in user_bucket.run(): 
    print "%s - %s" % (result[0],result[1]); 

它给像输出:

Bakshi - Sita 

但预计OUTPT是:

Bakshi - Sita 
Bakshi- Hari 
Bakshi- Shyam 
Bakshi- Howard 
Bakshi- Bindu 
Bakshi- Kishna 
Bakshi- Karma 
Bakshi- Dinesh 

什么,我做错了,我不能这样做里面的地图迭代()?

回答

1

我不是很熟悉,您所使用的技术,但考虑映射JS如何工作的,我想你怎么办所有的时间返回的第一个元素在你的函数的结果。 即您返回[Bakshi - Sita]作为您的结果,然后映射函数停止,一旦它返回。

我认为你需要做的是这样的:

user_bucket.map(""" 
    function(v){ 
     var data = JSON.parse(v.values[0].data); 
     var mapped = []; 
     if(data.is_active == true){ 
      tempUser = data.user; 
      tempFriendlist = data.friendlist; 
      for (var i=0; i<tempFriendlist.length; i++){ 
       friendValue = tempFriendlist[i]; 
       mapped.push[[tempUser, friendValue]];         
      }   
     } 
     return mapped; //if data.is_active == false, it will return empty array if you return here. If you want to return undefined for data.is_active == false, put this return statement inside your if, as the last thing after your for loop. 
    } 

    """) 

我希望这可以帮助你。

+0

我已经试过你的建议,但如何打印返回值映射 – bikas

+0

我已经印刷,这里是错误的'mapped.push([tempUser,friendValue]);' – bikas