Riak kv 中的 MapReduce 使用 JavaScript
MapReduce in Riak kv using JavaScript
我在 Riak DB 上的数据格式如下:
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'}
这里通过 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]];
}
}
}
""")
并打印 return 值
for result in user_bucket.run():
print "%s - %s" % (result[0],result[1]);
它给出的输出如下:
Bakshi - Sita
但预期的输出是:
Bakshi - Sita
Bakshi- Hari
Bakshi- Shyam
Bakshi- Howard
Bakshi- Bindu
Bakshi- Kishna
Bakshi- Karma
Bakshi- Dinesh
我在这里做错了什么,我不能在 map() 中进行迭代?
我不是很熟悉你使用的技术,但考虑到映射在 JS 中的工作方式,我认为你一直在做的是 return 作为函数结果的第一个元素。
即你 return [Bakshi - Sita] 作为你的结果然后映射函数停止,一旦它命中 return.
我认为你需要做如下事情:
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.
}
""")
希望对您有所帮助。
我在 Riak DB 上的数据格式如下:
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'}
这里通过 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]];
}
}
}
""")
并打印 return 值
for result in user_bucket.run():
print "%s - %s" % (result[0],result[1]);
它给出的输出如下:
Bakshi - Sita
但预期的输出是:
Bakshi - Sita
Bakshi- Hari
Bakshi- Shyam
Bakshi- Howard
Bakshi- Bindu
Bakshi- Kishna
Bakshi- Karma
Bakshi- Dinesh
我在这里做错了什么,我不能在 map() 中进行迭代?
我不是很熟悉你使用的技术,但考虑到映射在 JS 中的工作方式,我认为你一直在做的是 return 作为函数结果的第一个元素。 即你 return [Bakshi - Sita] 作为你的结果然后映射函数停止,一旦它命中 return.
我认为你需要做如下事情:
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.
}
""")
希望对您有所帮助。