最近看到一个使用scala+spark分析客户购买历史记录的例子。这个例子读取客户购买产品的历史记录文件,然后做4个统计分析:
1、 总的购买次数;
2、 不重复的客户人数;
3、 总的产品销售收入;
4、 最受欢迎的商品是什么。
用scala实现上述的4个统计,代码非常少。主要代码如下:
// 读取CSV 文件,把数据转换成(user, product, price)这样的元组数据 val data = sc.textFile("data/UserPurchaseHistory.csv") .map(line => line.split(",")) .map(purchaseRecord => (purchaseRecord(0), purchaseRecord(1), purchaseRecord(2))) // 统计购买商品的总数 val numPurchases = data.count // 统计有多少个用户(不重复的) val uniqueUsers = data.map { case (user, _, _) => user }.distinct().count // 统计总收入 val totalRevenue = data.map { case (_, _, price) => price.toDouble }.sum // 寻找最受欢迎的产品。这里的collect方法仅仅建议测试中使用。 val productsByPopularity = data .map { case (_, product, _) => (product, 1) } .reduceByKey(_ + _) .collect .sortBy(-_._2) val mostPopular = productsByPopularity(0)
用scala写出的代码确实非常短,很简练。如果是换成用java来写的话,代码会很长,结构也会很复杂。Scala实现的一个缺陷就是:因为语法灵活,允许省略很多东西。例如,省略方法括号,对那些无关紧要的变量用下划线“_”表示。如果换一个不熟悉scala的人来看代码,有可能觉得在看天书一样。