求助一下懂的人,关于 hadoop M/R 提取文本中的项值并输出,并根据某一项的值进行排序。

2015-05-24 16:34:13 +08:00
 alschw

毕设遇到的一些困难,刚接触hadoop。我这里有抓取到的一些商家的信息的文本,格式大概这样:
{
"status": 0,
"message": "ok",
"result": {
"name": "台北纯K(江北店)",
"location": {
"lng": 106.55089,
"lat": 29.585814
},
"address": "江北区北城天街46号九街高屋1楼(近同创国际)",
"telephone": "(023)67116711",
"uid": "d874d4cbb060e92e2bd7ab37",
"detail_info": {
"tag": "休闲娱乐;ktv",
"detail_url": "http://api.map.baidu.com/place/detail?uid\u003dd874d4cbb060e92e2bd7ab37\u0026output\u003dhtml\u0026source\u003dplaceapi_v2",
"type": "life",
"price": "95",
"overall_rating": "4.5",
"service_rating": "0",
"environment_rating": "0",
"image_num": "30",
"comment_num": "100",
"shop_hours": "11:00-",
"description": "门店介绍:"
}
}
}

{
"status": 0,
"message": "ok",
"result": {
"name": "欢乐迪KTV(未来国际店)",
"location": {
"lng": 106.53938,
"lat": 29.580435
},
"address": "观音桥步行街未来国际大厦5楼",
"telephone": "023-67704888",
"uid": "f696f3c267d7b4f21b11d5cd",
"detail_info": {
"tag": "休闲娱乐;ktv",
"detail_url": "http://api.map.baidu.com/place/detail?uid\u003df696f3c267d7b4f21b11d5cd\u0026output\u003dhtml\u0026source\u003dplaceapi_v2",
"type": "life",
"price": "23",
"overall_rating": "5.0",
"service_rating": "3.4",
"environment_rating": "3.6",
"image_num": "30",
"groupon_num": "10",
"comment_num": "1052",
"shop_hours": "13-00-次日凌晨3:30",
"alias": "HappydayKTV",
"description": "门店介绍:"
}
}
}
现在我想利用hadoop实现 提取某几个标签输出出来,比如输出成如下格式:
name overall_rating address
台北纯K(江北店) 4.5 江北区北城天街46号九街高屋1楼(近同创国际)
欢乐迪KTV(未来国际店) 5.0 观音桥步行街未来国际大厦5楼

然后再根据评分进行一下排序并输出排序结果,哪位懂的能给予一些指导吗?谢谢~

2839 次点击
所在节点    Hadoop
7 条回复
woshifyz
2015-05-24 22:19:21 +08:00
你确定你要的是M/R, 不是外排?
alschw
2015-05-24 23:45:12 +08:00
@woshifyz 谢谢回复 我查了一下外排(mapper 对每段数据先做排序,reducer 的 shuffle 对排好序的每段数据做归并)也OK啊 但是刚刚接触hadoop 确实不是很了解怎么去写map和reduce函数 环境配了好久才好的 能在windows下的eclipse下编译运行wordcount 接下来处理我上面提到的数据不知道怎么搞了 0.0
lujiajing1126
2015-05-25 09:21:49 +08:00
用hive→_→
woshifyz
2015-05-25 10:06:48 +08:00
@alschw 你这个只有map,没有reduce
alschw
2015-05-25 13:00:31 +08:00
@woshifyz 我的想法是这样的:用hadoop 处理文本中的评分数据 并简单计算自定义评分然后将其排序输出 只用到其中某几项键值: name、overall_rating、comment_num、address 取overall_rating(O)和comment_num(C)值,利用公式“score=O*0.5+C/(C+200)*0.5” 对score排序并按照score从大到小的顺序在每一行输出 “score name address”这种格式。确实不知道怎么弄了,您能不能给我一些帮助呀?
woshifyz
2015-05-25 13:58:48 +08:00
@alschw 你这个可以写个mapper,自定义mapper的排序方法,然后reducer数量设为1,直接输出你要的格式,如果用streaming方式的话,你可能需要自己组织下key的形成方式。
大致思路是这样,因为我也好久没玩m/r了。不过你最好还是先看看m/r的那几篇文章,至少知道map, shuffle, reduce这些过程都是什么,都干了嘛
alschw
2015-05-25 14:55:17 +08:00
@woshifyz 嗯 谢谢指导 我继续去研究 0.0

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/193365

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX