问题定义

本文介绍如何使用Spark 解决一个简单的问题,问题定义如下:

有一组微博数据,记录了每个用户和他好友之间信息。试编写一个程序从这些信息中找出:

1、从数据集中找到,关注别人的最多的10个用户,并计算关注最多的人与最少的人相差多少

2、从数据集中找到被关注最多和最少的明星用户,并统计被关注次数

3、统计目前这个数据集中有多少用户(需要去重)

备注:不使用sql 语句查询json. 采用传统的编程方式解决

测试数据字段定义:

用户ID, 用户关注ID列表,next_cursor, previous_cursor, 用户关注用户的数量

测试数据内容片段如下:

测试数据链接:http://pan.baidu.com/s/1csw75W 密码:xrdy

思路

问题1和问题3,比较简单,

问题1: 第一种方法可以在遍历数据时记录<id, total_number>然后,基于value 排序得到最多的10个用户

问题2:这个问题,如果用单机解决的思路可以是,对每个用户维护一个累加器,只要被某个用户关注了就加1.  如果使用spark 解决这个问题,可以考虑采用wordcount思路,考虑ids 字段, 对于ids字段中的每个id都是一个key, 对于每个key 出现一次就累加一次。

问题3:考虑到用户包含关注列表中的,也包含用户自己本身,简单的分析可以当作是一个wordcount问题求解

对于本次问题,还是比较简单的,只涉及到文本处理和简单的统计,并未涉及高级的特性与方法。主要目的是熟悉Spark 编程模型。

虽然可以用Dataframe 实现,但没什么意思。后面,也会增加dataframe 的实现例子。

开发实现

idea 创建项目

1. 新建Project ,选择 maven 项目(如果没有maven这个插件请自行安装)

1

2.设置组织信息

2

3.设置项目名称

3

4.创建完成之后,在main 函数中创建scala 文件夹

4

5.修改pom.xml 文件,增加如下内容

6. 创建一个Scala 类,在scala 文件夹下

编码

运行结果:

1

DataFrames 版本:

 

 

源码 Github 连接:https://github.com/Yiran-wu/iwantfind-tool

 

小结:

本项目代码还有很多可以优化的地方,比如解析部分可以通过一次遍历去解决。当前代码读了两次数据。另外代码细节上还有很多可以优化的部分,如解析JSON部分,分析互相关注的部分。代码经过本地测试通过。