原创

Spark之ALS商品推荐以及电影推荐

前言

一、一般来讲,推荐引擎试图对用户与某类物品之间的联系建模,其想法是预测人们可能喜好的物品并通过探索物品之间的联系来辅助这个过程,让用户能更快速、更准确的获得所需要的信息,提升用户的体验、参与度以及物品对用户的吸引力。

​ 在开始之前,先了解一下推荐模型的分类:

  • 1、基于内容的过滤:利用物品的内容或是属性信息以及某些相似度定义,求出与该物品类似的物品
  • 2、协同过滤:利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度
  • 3、矩阵分解(包括显示矩阵分解、隐式矩阵分解和最小二乘法)

二、当前Spark模型库中只包含基于矩阵分解的实现,其中最小二乘法(Alternating Least Squares,ALS)是一种求解矩阵分解问题的最优化方法(把稀疏的矩阵近似地转为两个稠密矩阵的乘积)。

一个推荐系统的实施,一般需要以下几个步骤:

  • 1、数据准备:获取训练模型所需的数据,比如收集用户历史以来的购买记录和浏览记录
  • 2、数据清理:大部分机器学习模型所处理的都是特征,但通常上述获取的数据都是原始形式,需要进一步处理。比如数据过滤、处理异常值、合并数据源、数据汇总等。本例重点放在评分计算规则上
  • 3、数据转化:对数据中的某些特征进行标准化(StandardScaler)、归一化(MinMaxScaler)、正则化(Normalizer)的缩放转化
  • 4、模型训练和测试回路:当数据已转化模型可识别的形式,就可以开始模型的训练和测试。把数据划分为两部分,一部分是训练数据,用于构建模型,另一部分是测试数据,用于检验模型
  • 5、模型评估:在训练数据集上运行模型并在测试集上测试其效果,进行交叉验证,评估其推荐效果
  • 6、模型优化:这部分关注对特定模型最佳参数的选择问题,通常情况下,我们会尝试调整算法中的超参数,通过多次迭代训练模型,选择最优的结果

1.用户商品推荐

数据:

file:///E:/Code/LearningBigData/spark-09-case/src/File/data2.txt

1,0,1.0
1,1,2.0
1,2,5.0
1,3,5.0
1,4,5.0
2,0,1.0
2,1,2.0
2,2,5.0
2,5,5.0
2,6,4.5
3,1,2.5
3,2,5.0
3,3,4.0
3,4,3.0
4,0,5.0
4,1,5.0
4,2,5.0
4,3,0.0

scala代码:

package com.lzhpo.spark.case1


import org.apache.spark.{SparkConf, SparkContext}
// $example on$
import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.MatrixFactorizationModel
import org.apache.spark.mllib.recommendation.Rating

/**
  * 
  * <p>Create By IntelliJ IDEA</p>
  * <p>Author:lzhpo</p>
  * 
  * 《ALS商品推荐》
  * 一共七款商品,四个用户。
  *       1号用户:
  *           第一个数字是指1号用户
  *           第二个数字是这个用户买了多少款商品
  *           第三个数字是指这个用户的评分
  *               1,0,1.0   --->1号用户买了0号商品,对这个商品的打分是1.0
  *               1,1,2.0   --->1号用户买了1号商品,对这个商品的打分是2.0
  *               1,2,5.0   --->1号用户买了2号商品,对这个商品的打分是5.0
  *               1,3,5.0   --->1号用户买了3号商品,对这个商品的打分是5.0
  *               1,4,5.0   --->1号用户买了4号商品,对这个商品的打分是5.0
  *
  *       2、3、4用户以此类推。
  *
  */
object RecommDemo {
    def main(args: Array[String]): Unit = {
        val conf = new SparkConf().setAppName("Recommend").setMaster("local[4]")
        val sc = new SparkContext(conf)
        // Load and parse the data
        val data = sc.textFile("file:///E:/Code/LearningBigData/spark-09-case/src/File/data2.txt")
        //变换数据成为Rating。
        val ratings = data.map(_.split(',') match { case Array(user, item, rate) =>
            Rating(user.toInt, item.toInt, rate.toDouble)
        })

        // Build the recommendation model using ALS
        val rank = 10
        val numIterations = 10
        //交替最小二乘法算法构建推荐模型
        val model = ALS.train(ratings, rank, numIterations, 0.01)

        // 取出评分数据的(User,product)
//        val usersProducts = ratings.map { case Rating(user, product, rate) =>
//            (user, product)
//        }

        //通过model对(user,product)进行预测,((user, product),rate)
//        val ug2 = sc.makeRDD(Array((2,3),(2,4)))
//        val predictions =
//            model.predict(ug2).map { case Rating(user, product, rate) =>
//                ((user, product), rate)
//            }
        //predictions.collect().foreach(println)
        //1.向用户推荐n款商品
        //val res = model.recommendProducts(5,8);

        //2.将指定的商品推荐给n个用户
        //val res = model.recommendUsers(3,5)

        //3.向所有用户推荐3种商品
        val res = model.recommendProductsForUsers(3)//recommendProducts:自带的推荐商品的方法
        res.foreach(e=>{
            println(e._1 + " ======= ")
            e._2.foreach(println)
        })
        //对训练数据进行map ,((user, product),rate)
//        val ratesAndPreds = ratings.map { case Rating(user, product, rate) =>
//            ((user, product), rate)
//        }.join(predictions)
//
//        ratesAndPreds.collect().foreach(println)
//
//        val MSE = ratesAndPreds.map { case ((user, product), (r1, r2)) =>
//            val err = (r1 - r2)
//            err * err
//        }.mean()
//        println("Mean Squared Error = " + MSE)

//        // Save and load model
//        model.save(sc, "target/tmp/myCollaborativeFilter")
//        val sameModel = MatrixFactorizationModel.load(sc, "target/tmp/myCollaborativeFilter")
        // $example off$
    }
}

推荐结果:

1 ======= 
Rating(1,2,4.9956823257673)
Rating(1,3,4.994066273818265)
Rating(1,4,4.993137159364182)



2 ======= 
Rating(2,2,4.999415988772956)
Rating(2,5,4.993626953956859)
Rating(2,6,4.494264279690479)


3 ======= 
Rating(3,2,5.002906042643627)
Rating(3,3,3.9719385687585795)
Rating(3,4,3.025093733721234)


4 ======= 
Rating(4,2,5.006958231007115)
Rating(4,0,4.990478304839243)
Rating(4,1,4.990211307656822)

1号用户推荐的是2、2、4商品;
2号用户推荐的是2、5、6商品;
3号用户推荐的是2、3、4商品;
4号用户推荐的是0、1、2商品。

其实,可以去看用户商品评级,1号用户对2、3、4商品的评级都是5.0,而对0号商品的评级仅仅是1.0,没毛病啊,所以程序没问题。其它的,以此类推。

2.电影推荐

数据:

file:///E:/Code/LearningBigData/spark-09-case/src/File/sample_movielens_ratings.txt

0::2::3::1424380312
0::3::1::1424380312
0::5::2::1424380312
0::9::4::1424380312
0::11::1::1424380312
0::12::2::1424380312
0::15::1::1424380312
0::17::1::1424380312
0::19::1::1424380312
0::21::1::1424380312
0::23::1::1424380312
0::26::3::1424380312
0::27::1::1424380312
0::28::1::1424380312
0::29::1::1424380312
0::30::1::1424380312
0::31::1::1424380312
0::34::1::1424380312
0::37::1::1424380312
0::41::2::1424380312
0::44::1::1424380312
0::45::2::1424380312
0::46::1::1424380312
0::47::1::1424380312
0::48::1::1424380312
0::50::1::1424380312
0::51::1::1424380312
0::54::1::1424380312
0::55::1::1424380312
0::59::2::1424380312
0::61::2::1424380312
0::64::1::1424380312
0::67::1::1424380312
0::68::1::1424380312
0::69::1::1424380312
0::71::1::1424380312
0::72::1::1424380312
0::77::2::1424380312
0::79::1::1424380312
0::83::1::1424380312
0::87::1::1424380312
0::89::2::1424380312
0::91::3::1424380312
0::92::4::1424380312
0::94::1::1424380312
0::95::2::1424380312
0::96::1::1424380312
0::98::1::1424380312
0::99::1::1424380312
1::2::2::1424380312
1::3::1::1424380312
1::4::2::1424380312
1::6::1::1424380312
1::9::3::1424380312
1::12::1::1424380312
1::13::1::1424380312
1::14::1::1424380312
1::16::1::1424380312
1::19::1::1424380312
1::21::3::1424380312
1::27::1::1424380312
1::28::3::1424380312
1::33::1::1424380312
1::36::2::1424380312
1::37::1::1424380312
1::40::1::1424380312
1::41::2::1424380312
1::43::1::1424380312
1::44::1::1424380312
1::47::1::1424380312
1::50::1::1424380312
1::54::1::1424380312
1::56::2::1424380312
1::57::1::1424380312
1::58::1::1424380312
1::60::1::1424380312
1::62::4::1424380312
1::63::1::1424380312
1::67::1::1424380312
1::68::4::1424380312
1::70::2::1424380312
1::72::1::1424380312
1::73::1::1424380312
1::74::2::1424380312
1::76::1::1424380312
1::77::3::1424380312
1::78::1::1424380312
1::81::1::1424380312
1::82::1::1424380312
1::85::3::1424380312
1::86::2::1424380312
1::88::2::1424380312
1::91::1::1424380312
1::92::2::1424380312
1::93::1::1424380312
1::94::2::1424380312
1::96::1::1424380312
1::97::1::1424380312
2::4::3::1424380312
2::6::1::1424380312
2::8::5::1424380312
2::9::1::1424380312
2::10::1::1424380312
2::12::3::1424380312
2::13::1::1424380312
2::15::2::1424380312
2::18::2::1424380312
2::19::4::1424380312
2::22::1::1424380312
2::26::1::1424380312
2::28::1::1424380312
2::34::4::1424380312
2::35::1::1424380312
2::37::5::1424380312
2::38::1::1424380312
2::39::5::1424380312
2::40::4::1424380312
2::47::1::1424380312
2::50::1::1424380312
2::52::2::1424380312
2::54::1::1424380312
2::55::1::1424380312
2::57::2::1424380312
2::58::2::1424380312
2::59::1::1424380312
2::61::1::1424380312
2::62::1::1424380312
2::64::1::1424380312
2::65::1::1424380312
2::66::3::1424380312
2::68::1::1424380312
2::71::3::1424380312
2::76::1::1424380312
2::77::1::1424380312
2::78::1::1424380312
2::80::1::1424380312
2::83::5::1424380312
2::85::1::1424380312
2::87::2::1424380312
2::88::1::1424380312
2::89::4::1424380312
2::90::1::1424380312
2::92::4::1424380312
2::93::5::1424380312
3::0::1::1424380312
3::1::1::1424380312
3::2::1::1424380312
3::7::3::1424380312
3::8::3::1424380312
3::9::1::1424380312
3::14::1::1424380312
3::15::1::1424380312
3::16::1::1424380312
3::18::4::1424380312
3::19::1::1424380312
3::24::3::1424380312
3::26::1::1424380312
3::29::3::1424380312
3::33::1::1424380312
3::34::3::1424380312
3::35::1::1424380312
3::36::3::1424380312
3::37::1::1424380312
3::38::2::1424380312
3::43::1::1424380312
3::44::1::1424380312
3::46::1::1424380312
3::47::1::1424380312
3::51::5::1424380312
3::52::3::1424380312
3::56::1::1424380312
3::58::1::1424380312
3::60::3::1424380312
3::62::1::1424380312
3::65::2::1424380312
3::66::1::1424380312
3::67::1::1424380312
3::68::2::1424380312
3::70::1::1424380312
3::72::2::1424380312
3::76::3::1424380312
3::79::3::1424380312
3::80::4::1424380312
3::81::1::1424380312
3::83::1::1424380312
3::84::1::1424380312
3::86::1::1424380312
3::87::2::1424380312
3::88::4::1424380312
3::89::1::1424380312
3::91::1::1424380312
3::94::3::1424380312
4::1::1::1424380312
4::6::1::1424380312
4::8::1::1424380312
4::9::1::1424380312
4::10::1::1424380312
4::11::1::1424380312
4::12::1::1424380312
4::13::1::1424380312
4::14::2::1424380312
4::15::1::1424380312
4::17::1::1424380312
4::20::1::1424380312
4::22::1::1424380312
4::23::1::1424380312
4::24::1::1424380312
4::29::4::1424380312
4::30::1::1424380312
4::31::1::1424380312
4::34::1::1424380312
4::35::1::1424380312
4::36::1::1424380312
4::39::2::1424380312
4::40::3::1424380312
4::41::4::1424380312
4::43::2::1424380312
4::44::1::1424380312
4::45::1::1424380312
4::46::1::1424380312
4::47::1::1424380312
4::49::2::1424380312
4::50::1::1424380312
4::51::1::1424380312
4::52::4::1424380312
4::54::1::1424380312
4::55::1::1424380312
4::60::3::1424380312
4::61::1::1424380312
4::62::4::1424380312
4::63::3::1424380312
4::65::1::1424380312
4::67::2::1424380312
4::69::1::1424380312
4::70::4::1424380312
4::71::1::1424380312
4::73::1::1424380312
4::78::1::1424380312
4::84::1::1424380312
4::85::1::1424380312
4::87::3::1424380312
4::88::3::1424380312
4::89::2::1424380312
4::96::1::1424380312
4::97::1::1424380312
4::98::1::1424380312
4::99::1::1424380312
5::0::1::1424380312
5::1::1::1424380312
5::4::1::1424380312
5::5::1::1424380312
5::8::1::1424380312
5::9::3::1424380312
5::10::2::1424380312
5::13::3::1424380312
5::15::1::1424380312
5::19::1::1424380312
5::20::3::1424380312
5::21::2::1424380312
5::23::3::1424380312
5::27::1::1424380312
5::28::1::1424380312
5::29::1::1424380312
5::31::1::1424380312
5::36::3::1424380312
5::38::2::1424380312
5::39::1::1424380312
5::42::1::1424380312
5::48::3::1424380312
5::49::4::1424380312
5::50::3::1424380312
5::51::1::1424380312
5::52::1::1424380312
5::54::1::1424380312
5::55::5::1424380312
5::56::3::1424380312
5::58::1::1424380312
5::60::1::1424380312
5::61::1::1424380312
5::64::3::1424380312
5::65::2::1424380312
5::68::4::1424380312
5::70::1::1424380312
5::71::1::1424380312
5::72::1::1424380312
5::74::1::1424380312
5::79::1::1424380312
5::81::2::1424380312
5::84::1::1424380312
5::85::1::1424380312
5::86::1::1424380312
5::88::1::1424380312
5::90::4::1424380312
5::91::2::1424380312
5::95::2::1424380312
5::99::1::1424380312
6::0::1::1424380312
6::1::1::1424380312
6::2::3::1424380312
6::5::1::1424380312
6::6::1::1424380312
6::9::1::1424380312
6::10::1::1424380312
6::15::2::1424380312
6::16::2::1424380312
6::17::1::1424380312
6::18::1::1424380312
6::20::1::1424380312
6::21::1::1424380312
6::22::1::1424380312
6::24::1::1424380312
6::25::5::1424380312
6::26::1::1424380312
6::28::1::1424380312
6::30::1::1424380312
6::33::1::1424380312
6::38::1::1424380312
6::39::1::1424380312
6::43::4::1424380312
6::44::1::1424380312
6::45::1::1424380312
6::48::1::1424380312
6::49::1::1424380312
6::50::1::1424380312
6::53::1::1424380312
6::54::1::1424380312
6::55::1::1424380312
6::56::1::1424380312
6::58::4::1424380312
6::59::1::1424380312
6::60::1::1424380312
6::61::3::1424380312
6::63::3::1424380312
6::66::1::1424380312
6::67::3::1424380312
6::68::1::1424380312
6::69::1::1424380312
6::71::2::1424380312
6::73::1::1424380312
6::75::1::1424380312
6::77::1::1424380312
6::79::1::1424380312
6::81::1::1424380312
6::84::1::1424380312
6::85::3::1424380312
6::86::1::1424380312
6::87::1::1424380312
6::88::1::1424380312
6::89::1::1424380312
6::91::2::1424380312
6::94::1::1424380312
6::95::2::1424380312
6::96::1::1424380312
7::1::1::1424380312
7::2::2::1424380312
7::3::1::1424380312
7::4::1::1424380312
7::7::1::1424380312
7::10::1::1424380312
7::11::2::1424380312
7::14::2::1424380312
7::15::1::1424380312
7::16::1::1424380312
7::18::1::1424380312
7::21::1::1424380312
7::22::1::1424380312
7::23::1::1424380312
7::25::5::1424380312
7::26::1::1424380312
7::29::4::1424380312
7::30::1::1424380312
7::31::3::1424380312
7::32::1::1424380312
7::33::1::1424380312
7::35::1::1424380312
7::37::2::1424380312
7::39::3::1424380312
7::40::2::1424380312
7::42::2::1424380312
7::44::1::1424380312
7::45::2::1424380312
7::47::4::1424380312
7::48::1::1424380312
7::49::1::1424380312
7::53::1::1424380312
7::54::1::1424380312
7::55::1::1424380312
7::56::1::1424380312
7::59::1::1424380312
7::61::2::1424380312
7::62::3::1424380312
7::63::2::1424380312
7::66::1::1424380312
7::67::3::1424380312
7::74::1::1424380312
7::75::1::1424380312
7::76::3::1424380312
7::77::1::1424380312
7::81::1::1424380312
7::82::1::1424380312
7::84::2::1424380312
7::85::4::1424380312
7::86::1::1424380312
7::92::2::1424380312
7::96::1::1424380312
7::97::1::1424380312
7::98::1::1424380312
8::0::1::1424380312
8::2::4::1424380312
8::3::2::1424380312
8::4::2::1424380312
8::5::1::1424380312
8::7::1::1424380312
8::9::1::1424380312
8::11::1::1424380312
8::15::1::1424380312
8::18::1::1424380312
8::19::1::1424380312
8::21::1::1424380312
8::29::5::1424380312
8::31::3::1424380312
8::33::1::1424380312
8::35::1::1424380312
8::36::1::1424380312
8::40::2::1424380312
8::44::1::1424380312
8::45::1::1424380312
8::50::1::1424380312
8::51::1::1424380312
8::52::5::1424380312
8::53::5::1424380312
8::54::1::1424380312
8::55::1::1424380312
8::56::1::1424380312
8::58::4::1424380312
8::60::3::1424380312
8::62::4::1424380312
8::64::1::1424380312
8::67::3::1424380312
8::69::1::1424380312
8::71::1::1424380312
8::72::3::1424380312
8::77::3::1424380312
8::78::1::1424380312
8::79::1::1424380312
8::83::1::1424380312
8::85::5::1424380312
8::86::1::1424380312
8::88::1::1424380312
8::90::1::1424380312
8::92::2::1424380312
8::95::4::1424380312
8::96::3::1424380312
8::97::1::1424380312
8::98::1::1424380312
8::99::1::1424380312
9::2::3::1424380312
9::3::1::1424380312
9::4::1::1424380312
9::5::1::1424380312
9::6::1::1424380312
9::7::5::1424380312
9::9::1::1424380312
9::12::1::1424380312
9::14::3::1424380312
9::15::1::1424380312
9::19::1::1424380312
9::21::1::1424380312
9::22::1::1424380312
9::24::1::1424380312
9::25::1::1424380312
9::26::1::1424380312
9::30::3::1424380312
9::32::4::1424380312
9::35::2::1424380312
9::36::2::1424380312
9::37::2::1424380312
9::38::1::1424380312
9::39::1::1424380312
9::43::3::1424380312
9::49::5::1424380312
9::50::3::1424380312
9::53::1::1424380312
9::54::1::1424380312
9::58::1::1424380312
9::59::1::1424380312
9::60::1::1424380312
9::61::1::1424380312
9::63::3::1424380312
9::64::3::1424380312
9::68::1::1424380312
9::69::1::1424380312
9::70::3::1424380312
9::71::1::1424380312
9::73::2::1424380312
9::75::1::1424380312
9::77::2::1424380312
9::81::2::1424380312
9::82::1::1424380312
9::83::1::1424380312
9::84::1::1424380312
9::86::1::1424380312
9::87::4::1424380312
9::88::1::1424380312
9::90::3::1424380312
9::94::2::1424380312
9::95::3::1424380312
9::97::2::1424380312
9::98::1::1424380312
10::0::3::1424380312
10::2::4::1424380312
10::4::3::1424380312
10::7::1::1424380312
10::8::1::1424380312
10::10::1::1424380312
10::13::2::1424380312
10::14::1::1424380312
10::16::2::1424380312
10::17::1::1424380312
10::18::1::1424380312
10::21::1::1424380312
10::22::1::1424380312
10::24::1::1424380312
10::25::3::1424380312
10::28::1::1424380312
10::35::1::1424380312
10::36::1::1424380312
10::37::1::1424380312
10::38::1::1424380312
10::39::1::1424380312
10::40::4::1424380312
10::41::2::1424380312
10::42::3::1424380312
10::43::1::1424380312
10::49::3::1424380312
10::50::1::1424380312
10::51::1::1424380312
10::52::1::1424380312
10::55::2::1424380312
10::56::1::1424380312
10::58::1::1424380312
10::63::1::1424380312
10::66::1::1424380312
10::67::2::1424380312
10::68::1::1424380312
10::75::1::1424380312
10::77::1::1424380312
10::79::1::1424380312
10::86::1::1424380312
10::89::3::1424380312
10::90::1::1424380312
10::97::1::1424380312
10::98::1::1424380312
11::0::1::1424380312
11::6::2::1424380312
11::9::1::1424380312
11::10::1::1424380312
11::11::1::1424380312
11::12::1::1424380312
11::13::4::1424380312
11::16::1::1424380312
11::18::5::1424380312
11::19::4::1424380312
11::20::1::1424380312
11::21::1::1424380312
11::22::1::1424380312
11::23::5::1424380312
11::25::1::1424380312
11::27::5::1424380312
11::30::5::1424380312
11::32::5::1424380312
11::35::3::1424380312
11::36::2::1424380312
11::37::2::1424380312
11::38::4::1424380312
11::39::1::1424380312
11::40::1::1424380312
11::41::1::1424380312
11::43::2::1424380312
11::45::1::1424380312
11::47::1::1424380312
11::48::5::1424380312
11::50::4::1424380312
11::51::3::1424380312
11::59::1::1424380312
11::61::1::1424380312
11::62::1::1424380312
11::64::1::1424380312
11::66::4::1424380312
11::67::1::1424380312
11::69::5::1424380312
11::70::1::1424380312
11::71::3::1424380312
11::72::3::1424380312
11::75::3::1424380312
11::76::1::1424380312
11::77::1::1424380312
11::78::1::1424380312
11::79::5::1424380312
11::80::3::1424380312
11::81::4::1424380312
11::82::1::1424380312
11::86::1::1424380312
11::88::1::1424380312
11::89::1::1424380312
11::90::4::1424380312
11::94::2::1424380312
11::97::3::1424380312
11::99::1::1424380312
12::2::1::1424380312
12::4::1::1424380312
12::6::1::1424380312
12::7::3::1424380312
12::8::1::1424380312
12::14::1::1424380312
12::15::2::1424380312
12::16::4::1424380312
12::17::5::1424380312
12::18::2::1424380312
12::21::1::1424380312
12::22::2::1424380312
12::23::3::1424380312
12::24::1::1424380312
12::25::1::1424380312
12::27::5::1424380312
12::30::2::1424380312
12::31::4::1424380312
12::35::5::1424380312
12::38::1::1424380312
12::41::1::1424380312
12::44::2::1424380312
12::45::1::1424380312
12::50::4::1424380312
12::51::1::1424380312
12::52::1::1424380312
12::53::1::1424380312
12::54::1::1424380312
12::56::2::1424380312
12::57::1::1424380312
12::60::1::1424380312
12::63::1::1424380312
12::64::5::1424380312
12::66::3::1424380312
12::67::1::1424380312
12::70::1::1424380312
12::72::1::1424380312
12::74::1::1424380312
12::75::1::1424380312
12::77::1::1424380312
12::78::1::1424380312
12::79::3::1424380312
12::82::2::1424380312
12::83::1::1424380312
12::84::1::1424380312
12::85::1::1424380312
12::86::1::1424380312
12::87::1::1424380312
12::88::1::1424380312
12::91::3::1424380312
12::92::1::1424380312
12::94::4::1424380312
12::95::2::1424380312
12::96::1::1424380312
12::98::2::1424380312
13::0::1::1424380312
13::3::1::1424380312
13::4::2::1424380312
13::5::1::1424380312
13::6::1::1424380312
13::12::1::1424380312
13::14::2::1424380312
13::15::1::1424380312
13::17::1::1424380312
13::18::3::1424380312
13::20::1::1424380312
13::21::1::1424380312
13::22::1::1424380312
13::26::1::1424380312
13::27::1::1424380312
13::29::3::1424380312
13::31::1::1424380312
13::33::1::1424380312
13::40::2::1424380312
13::43::2::1424380312
13::44::1::1424380312
13::45::1::1424380312
13::49::1::1424380312
13::51::1::1424380312
13::52::2::1424380312
13::53::3::1424380312
13::54::1::1424380312
13::62::1::1424380312
13::63::2::1424380312
13::64::1::1424380312
13::68::1::1424380312
13::71::1::1424380312
13::72::3::1424380312
13::73::1::1424380312
13::74::3::1424380312
13::77::2::1424380312
13::78::1::1424380312
13::79::2::1424380312
13::83::3::1424380312
13::85::1::1424380312
13::86::1::1424380312
13::87::2::1424380312
13::88::2::1424380312
13::90::1::1424380312
13::93::4::1424380312
13::94::1::1424380312
13::98::1::1424380312
13::99::1::1424380312
14::1::1::1424380312
14::3::3::1424380312
14::4::1::1424380312
14::5::1::1424380312
14::6::1::1424380312
14::7::1::1424380312
14::9::1::1424380312
14::10::1::1424380312
14::11::1::1424380312
14::12::1::1424380312
14::13::1::1424380312
14::14::3::1424380312
14::15::1::1424380312
14::16::1::1424380312
14::17::1::1424380312
14::20::1::1424380312
14::21::1::1424380312
14::24::1::1424380312
14::25::2::1424380312
14::27::1::1424380312
14::28::1::1424380312
14::29::5::1424380312
14::31::3::1424380312
14::34::1::1424380312
14::36::1::1424380312
14::37::2::1424380312
14::39::2::1424380312
14::40::1::1424380312
14::44::1::1424380312
14::45::1::1424380312
14::47::3::1424380312
14::48::1::1424380312
14::49::1::1424380312
14::51::1::1424380312
14::52::5::1424380312
14::53::3::1424380312
14::54::1::1424380312
14::55::1::1424380312
14::56::1::1424380312
14::62::4::1424380312
14::63::5::1424380312
14::67::3::1424380312
14::68::1::1424380312
14::69::3::1424380312
14::71::1::1424380312
14::72::4::1424380312
14::73::1::1424380312
14::76::5::1424380312
14::79::1::1424380312
14::82::1::1424380312
14::83::1::1424380312
14::88::1::1424380312
14::93::3::1424380312
14::94::1::1424380312
14::95::2::1424380312
14::96::4::1424380312
14::98::1::1424380312
15::0::1::1424380312
15::1::4::1424380312
15::2::1::1424380312
15::5::2::1424380312
15::6::1::1424380312
15::7::1::1424380312
15::13::1::1424380312
15::14::1::1424380312
15::15::1::1424380312
15::17::2::1424380312
15::19::2::1424380312
15::22::2::1424380312
15::23::2::1424380312
15::25::1::1424380312
15::26::3::1424380312
15::27::1::1424380312
15::28::2::1424380312
15::29::1::1424380312
15::32::1::1424380312
15::33::2::1424380312
15::34::1::1424380312
15::35::2::1424380312
15::36::1::1424380312
15::37::1::1424380312
15::39::1::1424380312
15::42::1::1424380312
15::46::5::1424380312
15::48::2::1424380312
15::50::2::1424380312
15::51::1::1424380312
15::52::1::1424380312
15::58::1::1424380312
15::62::1::1424380312
15::64::3::1424380312
15::65::2::1424380312
15::72::1::1424380312
15::73::1::1424380312
15::74::1::1424380312
15::79::1::1424380312
15::80::1::1424380312
15::81::1::1424380312
15::82::2::1424380312
15::85::1::1424380312
15::87::1::1424380312
15::91::2::1424380312
15::96::1::1424380312
15::97::1::1424380312
15::98::3::1424380312
16::2::1::1424380312
16::5::3::1424380312
16::6::2::1424380312
16::7::1::1424380312
16::9::1::1424380312
16::12::1::1424380312
16::14::1::1424380312
16::15::1::1424380312
16::19::1::1424380312
16::21::2::1424380312
16::29::4::1424380312
16::30::2::1424380312
16::32::1::1424380312
16::34::1::1424380312
16::36::1::1424380312
16::38::1::1424380312
16::46::1::1424380312
16::47::3::1424380312
16::48::1::1424380312
16::49::1::1424380312
16::50::1::1424380312
16::51::5::1424380312
16::54::5::1424380312
16::55::1::1424380312
16::56::2::1424380312
16::57::1::1424380312
16::60::1::1424380312
16::63::2::1424380312
16::65::1::1424380312
16::67::1::1424380312
16::72::1::1424380312
16::74::1::1424380312
16::80::1::1424380312
16::81::1::1424380312
16::82::1::1424380312
16::85::5::1424380312
16::86::1::1424380312
16::90::5::1424380312
16::91::1::1424380312
16::93::1::1424380312
16::94::3::1424380312
16::95::2::1424380312
16::96::3::1424380312
16::98::3::1424380312
16::99::1::1424380312
17::2::1::1424380312
17::3::1::1424380312
17::6::1::1424380312
17::10::4::1424380312
17::11::1::1424380312
17::13::2::1424380312
17::17::5::1424380312
17::19::1::1424380312
17::20::5::1424380312
17::22::4::1424380312
17::28::1::1424380312
17::29::1::1424380312
17::33::1::1424380312
17::34::1::1424380312
17::35::2::1424380312
17::37::1::1424380312
17::38::1::1424380312
17::45::1::1424380312
17::46::5::1424380312
17::47::1::1424380312
17::49::3::1424380312
17::51::1::1424380312
17::55::5::1424380312
17::56::3::1424380312
17::57::1::1424380312
17::58::1::1424380312
17::59::1::1424380312
17::60::1::1424380312
17::63::1::1424380312
17::66::1::1424380312
17::68::4::1424380312
17::69::1::1424380312
17::70::1::1424380312
17::72::1::1424380312
17::73::3::1424380312
17::78::1::1424380312
17::79::1::1424380312
17::82::2::1424380312
17::84::1::1424380312
17::90::5::1424380312
17::91::3::1424380312
17::92::1::1424380312
17::93::1::1424380312
17::94::4::1424380312
17::95::2::1424380312
17::97::1::1424380312
18::1::1::1424380312
18::4::3::1424380312
18::5::2::1424380312
18::6::1::1424380312
18::7::1::1424380312
18::10::1::1424380312
18::11::4::1424380312
18::12::2::1424380312
18::13::1::1424380312
18::15::1::1424380312
18::18::1::1424380312
18::20::1::1424380312
18::21::2::1424380312
18::22::1::1424380312
18::23::2::1424380312
18::25::1::1424380312
18::26::1::1424380312
18::27::1::1424380312
18::28::5::1424380312
18::29::1::1424380312
18::31::1::1424380312
18::32::1::1424380312
18::36::1::1424380312
18::38::5::1424380312
18::39::5::1424380312
18::40::1::1424380312
18::42::1::1424380312
18::43::1::1424380312
18::44::4::1424380312
18::46::1::1424380312
18::47::1::1424380312
18::48::1::1424380312
18::51::2::1424380312
18::55::1::1424380312
18::56::1::1424380312
18::57::1::1424380312
18::62::1::1424380312
18::63::1::1424380312
18::66::3::1424380312
18::67::1::1424380312
18::70::1::1424380312
18::75::1::1424380312
18::76::3::1424380312
18::77::1::1424380312
18::80::3::1424380312
18::81::3::1424380312
18::82::1::1424380312
18::83::5::1424380312
18::84::1::1424380312
18::97::1::1424380312
18::98::1::1424380312
18::99::2::1424380312
19::0::1::1424380312
19::1::1::1424380312
19::2::1::1424380312
19::4::1::1424380312
19::6::2::1424380312
19::11::1::1424380312
19::12::1::1424380312
19::14::1::1424380312
19::23::1::1424380312
19::26::1::1424380312
19::31::1::1424380312
19::32::4::1424380312
19::33::1::1424380312
19::34::1::1424380312
19::37::1::1424380312
19::38::1::1424380312
19::41::1::1424380312
19::43::1::1424380312
19::45::1::1424380312
19::48::1::1424380312
19::49::1::1424380312
19::50::2::1424380312
19::53::2::1424380312
19::54::3::1424380312
19::55::1::1424380312
19::56::2::1424380312
19::58::1::1424380312
19::61::1::1424380312
19::62::1::1424380312
19::63::1::1424380312
19::64::1::1424380312
19::65::1::1424380312
19::69::2::1424380312
19::72::1::1424380312
19::74::3::1424380312
19::76::1::1424380312
19::78::1::1424380312
19::79::1::1424380312
19::81::1::1424380312
19::82::1::1424380312
19::84::1::1424380312
19::86::1::1424380312
19::87::2::1424380312
19::90::4::1424380312
19::93::1::1424380312
19::94::4::1424380312
19::95::2::1424380312
19::96::1::1424380312
19::98::4::1424380312
20::0::1::1424380312
20::1::1::1424380312
20::2::2::1424380312
20::4::2::1424380312
20::6::1::1424380312
20::8::1::1424380312
20::12::1::1424380312
20::21::2::1424380312
20::22::5::1424380312
20::24::2::1424380312
20::25::1::1424380312
20::26::1::1424380312
20::29::2::1424380312
20::30::2::1424380312
20::32::2::1424380312
20::39::1::1424380312
20::40::1::1424380312
20::41::2::1424380312
20::45::2::1424380312
20::48::1::1424380312
20::50::1::1424380312
20::51::3::1424380312
20::53::3::1424380312
20::55::1::1424380312
20::57::2::1424380312
20::60::1::1424380312
20::61::1::1424380312
20::64::1::1424380312
20::66::1::1424380312
20::70::2::1424380312
20::72::1::1424380312
20::73::2::1424380312
20::75::4::1424380312
20::76::1::1424380312
20::77::4::1424380312
20::78::1::1424380312
20::79::1::1424380312
20::84::2::1424380312
20::85::2::1424380312
20::88::3::1424380312
20::89::1::1424380312
20::90::3::1424380312
20::91::1::1424380312
20::92::2::1424380312
20::93::1::1424380312
20::94::4::1424380312
20::97::1::1424380312
21::0::1::1424380312
21::2::4::1424380312
21::3::1::1424380312
21::7::2::1424380312
21::11::1::1424380312
21::12::1::1424380312
21::13::1::1424380312
21::14::3::1424380312
21::17::1::1424380312
21::19::1::1424380312
21::20::1::1424380312
21::21::1::1424380312
21::22::1::1424380312
21::23::1::1424380312
21::24::1::1424380312
21::27::1::1424380312
21::29::5::1424380312
21::30::2::1424380312
21::38::1::1424380312
21::40::2::1424380312
21::43::3::1424380312
21::44::1::1424380312
21::45::1::1424380312
21::46::1::1424380312
21::48::1::1424380312
21::51::1::1424380312
21::53::5::1424380312
21::54::1::1424380312
21::55::1::1424380312
21::56::1::1424380312
21::58::3::1424380312
21::59::3::1424380312
21::64::1::1424380312
21::66::1::1424380312
21::68::1::1424380312
21::71::1::1424380312
21::73::1::1424380312
21::74::4::1424380312
21::80::1::1424380312
21::81::1::1424380312
21::83::1::1424380312
21::84::1::1424380312
21::85::3::1424380312
21::87::4::1424380312
21::89::2::1424380312
21::92::2::1424380312
21::96::3::1424380312
21::99::1::1424380312
22::0::1::1424380312
22::3::2::1424380312
22::5::2::1424380312
22::6::2::1424380312
22::9::1::1424380312
22::10::1::1424380312
22::11::1::1424380312
22::13::1::1424380312
22::14::1::1424380312
22::16::1::1424380312
22::18::3::1424380312
22::19::1::1424380312
22::22::5::1424380312
22::25::1::1424380312
22::26::1::1424380312
22::29::3::1424380312
22::30::5::1424380312
22::32::4::1424380312
22::33::1::1424380312
22::35::1::1424380312
22::36::3::1424380312
22::37::1::1424380312
22::40::1::1424380312
22::41::3::1424380312
22::44::1::1424380312
22::45::2::1424380312
22::48::1::1424380312
22::51::5::1424380312
22::55::1::1424380312
22::56::2::1424380312
22::60::3::1424380312
22::61::1::1424380312
22::62::4::1424380312
22::63::1::1424380312
22::65::1::1424380312
22::66::1::1424380312
22::68::4::1424380312
22::69::4::1424380312
22::70::3::1424380312
22::71::1::1424380312
22::74::5::1424380312
22::75::5::1424380312
22::78::1::1424380312
22::80::3::1424380312
22::81::1::1424380312
22::82::1::1424380312
22::84::1::1424380312
22::86::1::1424380312
22::87::3::1424380312
22::88::5::1424380312
22::90::2::1424380312
22::92::3::1424380312
22::95::2::1424380312
22::96::2::1424380312
22::98::4::1424380312
22::99::1::1424380312
23::0::1::1424380312
23::2::1::1424380312
23::4::1::1424380312
23::6::2::1424380312
23::10::4::1424380312
23::12::1::1424380312
23::13::4::1424380312
23::14::1::1424380312
23::15::1::1424380312
23::18::4::1424380312
23::22::2::1424380312
23::23::4::1424380312
23::24::1::1424380312
23::25::1::1424380312
23::26::1::1424380312
23::27::5::1424380312
23::28::1::1424380312
23::29::1::1424380312
23::30::4::1424380312
23::32::5::1424380312
23::33::2::1424380312
23::36::3::1424380312
23::37::1::1424380312
23::38::1::1424380312
23::39::1::1424380312
23::43::1::1424380312
23::48::5::1424380312
23::49::5::1424380312
23::50::4::1424380312
23::53::1::1424380312
23::55::5::1424380312
23::57::1::1424380312
23::59::1::1424380312
23::60::1::1424380312
23::61::1::1424380312
23::64::4::1424380312
23::65::5::1424380312
23::66::2::1424380312
23::67::1::1424380312
23::68::3::1424380312
23::69::1::1424380312
23::72::1::1424380312
23::73::3::1424380312
23::77::1::1424380312
23::82::2::1424380312
23::83::1::1424380312
23::84::1::1424380312
23::85::1::1424380312
23::87::3::1424380312
23::88::1::1424380312
23::95::2::1424380312
23::97::1::1424380312
24::4::1::1424380312
24::6::3::1424380312
24::7::1::1424380312
24::10::2::1424380312
24::12::1::1424380312
24::15::1::1424380312
24::19::1::1424380312
24::24::1::1424380312
24::27::3::1424380312
24::30::5::1424380312
24::31::1::1424380312
24::32::3::1424380312
24::33::1::1424380312
24::37::1::1424380312
24::39::1::1424380312
24::40::1::1424380312
24::42::1::1424380312
24::43::3::1424380312
24::45::2::1424380312
24::46::1::1424380312
24::47::1::1424380312
24::48::1::1424380312
24::49::1::1424380312
24::50::1::1424380312
24::52::5::1424380312
24::57::1::1424380312
24::59::4::1424380312
24::63::4::1424380312
24::65::1::1424380312
24::66::1::1424380312
24::67::1::1424380312
24::68::3::1424380312
24::69::5::1424380312
24::71::1::1424380312
24::72::4::1424380312
24::77::4::1424380312
24::78::1::1424380312
24::80::1::1424380312
24::82::1::1424380312
24::84::1::1424380312
24::86::1::1424380312
24::87::1::1424380312
24::88::2::1424380312
24::89::1::1424380312
24::90::5::1424380312
24::91::1::1424380312
24::92::1::1424380312
24::94::2::1424380312
24::95::1::1424380312
24::96::5::1424380312
24::98::1::1424380312
24::99::1::1424380312
25::1::3::1424380312
25::2::1::1424380312
25::7::1::1424380312
25::9::1::1424380312
25::12::3::1424380312
25::16::3::1424380312
25::17::1::1424380312
25::18::1::1424380312
25::20::1::1424380312
25::22::1::1424380312
25::23::1::1424380312
25::26::2::1424380312
25::29::1::1424380312
25::30::1::1424380312
25::31::2::1424380312
25::33::4::1424380312
25::34::3::1424380312
25::35::2::1424380312
25::36::1::1424380312
25::37::1::1424380312
25::40::1::1424380312
25::41::1::1424380312
25::43::1::1424380312
25::47::4::1424380312
25::50::1::1424380312
25::51::1::1424380312
25::53::1::1424380312
25::56::1::1424380312
25::58::2::1424380312
25::64::2::1424380312
25::67::2::1424380312
25::68::1::1424380312
25::70::1::1424380312
25::71::4::1424380312
25::73::1::1424380312
25::74::1::1424380312
25::76::1::1424380312
25::79::1::1424380312
25::82::1::1424380312
25::84::2::1424380312
25::85::1::1424380312
25::91::3::1424380312
25::92::1::1424380312
25::94::1::1424380312
25::95::1::1424380312
25::97::2::1424380312
26::0::1::1424380312
26::1::1::1424380312
26::2::1::1424380312
26::3::1::1424380312
26::4::4::1424380312
26::5::2::1424380312
26::6::3::1424380312
26::7::5::1424380312
26::13::3::1424380312
26::14::1::1424380312
26::16::1::1424380312
26::18::3::1424380312
26::20::1::1424380312
26::21::3::1424380312
26::22::5::1424380312
26::23::5::1424380312
26::24::5::1424380312
26::27::1::1424380312
26::31::1::1424380312
26::35::1::1424380312
26::36::4::1424380312
26::40::1::1424380312
26::44::1::1424380312
26::45::2::1424380312
26::47::1::1424380312
26::48::1::1424380312
26::49::3::1424380312
26::50::2::1424380312
26::52::1::1424380312
26::54::4::1424380312
26::55::1::1424380312
26::57::3::1424380312
26::58::1::1424380312
26::61::1::1424380312
26::62::2::1424380312
26::66::1::1424380312
26::68::4::1424380312
26::71::1::1424380312
26::73::4::1424380312
26::76::1::1424380312
26::81::3::1424380312
26::85::1::1424380312
26::86::3::1424380312
26::88::5::1424380312
26::91::1::1424380312
26::94::5::1424380312
26::95::1::1424380312
26::96::1::1424380312
26::97::1::1424380312
27::0::1::1424380312
27::9::1::1424380312
27::10::1::1424380312
27::18::4::1424380312
27::19::3::1424380312
27::20::1::1424380312
27::22::2::1424380312
27::24::2::1424380312
27::25::1::1424380312
27::27::3::1424380312
27::28::1::1424380312
27::29::1::1424380312
27::31::1::1424380312
27::33::3::1424380312
27::40::1::1424380312
27::42::1::1424380312
27::43::1::1424380312
27::44::3::1424380312
27::45::1::1424380312
27::51::3::1424380312
27::52::1::1424380312
27::55::3::1424380312
27::57::1::1424380312
27::59::1::1424380312
27::60::1::1424380312
27::61::1::1424380312
27::64::1::1424380312
27::66::3::1424380312
27::68::1::1424380312
27::70::1::1424380312
27::71::2::1424380312
27::72::1::1424380312
27::75::3::1424380312
27::78::1::1424380312
27::80::3::1424380312
27::82::1::1424380312
27::83::3::1424380312
27::86::1::1424380312
27::87::2::1424380312
27::90::1::1424380312
27::91::1::1424380312
27::92::1::1424380312
27::93::1::1424380312
27::94::2::1424380312
27::95::1::1424380312
27::98::1::1424380312
28::0::3::1424380312
28::1::1::1424380312
28::2::4::1424380312
28::3::1::1424380312
28::6::1::1424380312
28::7::1::1424380312
28::12::5::1424380312
28::13::2::1424380312
28::14::1::1424380312
28::15::1::1424380312
28::17::1::1424380312
28::19::3::1424380312
28::20::1::1424380312
28::23::3::1424380312
28::24::3::1424380312
28::27::1::1424380312
28::29::1::1424380312
28::33::1::1424380312
28::34::1::1424380312
28::36::1::1424380312
28::38::2::1424380312
28::39::2::1424380312
28::44::1::1424380312
28::45::1::1424380312
28::49::4::1424380312
28::50::1::1424380312
28::52::1::1424380312
28::54::1::1424380312
28::56::1::1424380312
28::57::3::1424380312
28::58::1::1424380312
28::59::1::1424380312
28::60::1::1424380312
28::62::3::1424380312
28::63::1::1424380312
28::65::1::1424380312
28::75::1::1424380312
28::78::1::1424380312
28::81::5::1424380312
28::82::4::1424380312
28::83::1::1424380312
28::85::1::1424380312
28::88::2::1424380312
28::89::4::1424380312
28::90::1::1424380312
28::92::5::1424380312
28::94::1::1424380312
28::95::2::1424380312
28::98::1::1424380312
28::99::1::1424380312
29::3::1::1424380312
29::4::1::1424380312
29::5::1::1424380312
29::7::2::1424380312
29::9::1::1424380312
29::10::3::1424380312
29::11::1::1424380312
29::13::3::1424380312
29::14::1::1424380312
29::15::1::1424380312
29::17::3::1424380312
29::19::3::1424380312
29::22::3::1424380312
29::23::4::1424380312
29::25::1::1424380312
29::29::1::1424380312
29::31::1::1424380312
29::32::4::1424380312
29::33::2::1424380312
29::36::2::1424380312
29::38::3::1424380312
29::39::1::1424380312
29::42::1::1424380312
29::46::5::1424380312
29::49::3::1424380312
29::51::2::1424380312
29::59::1::1424380312
29::61::1::1424380312
29::62::1::1424380312
29::67::1::1424380312
29::68::3::1424380312
29::69::1::1424380312
29::70::1::1424380312
29::74::1::1424380312
29::75::1::1424380312
29::79::2::1424380312
29::80::1::1424380312
29::81::2::1424380312
29::83::1::1424380312
29::85::1::1424380312
29::86::1::1424380312
29::90::4::1424380312
29::93::1::1424380312
29::94::4::1424380312
29::97::1::1424380312
29::99::1::1424380312

scala代码:

package com.lzhpo.spark.case2

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.ml.evaluation.RegressionEvaluator
import org.apache.spark.ml.recommendation.ALS
import org.apache.spark.sql.SparkSession

/**
  * <p>Create By IntelliJ IDEA</p>
  * <p>Author:lzhpo</p>
  *
  * 《ALS电影推荐》
  *
  *
  *         0::2::3::1424380312     --->0号用户观看2号电影,评分为3,1424380312为时间戳。
  *         0::3::1::1424380312             ........
  *         0::5::2::1424380312             以此类推
  *         0::9::4::1424380312             ........
  *
  */
object MovieRecommDemo {

    //定义评级样例类
    case class Rating0(userId: Int, movieId: Int, rating: Float, timestamp: Long)

    def main(args: Array[String]): Unit = {
        val conf = new SparkConf();
        conf.setAppName("movieRecomm");
        conf.setMaster("local[4]")

        val spark = SparkSession.builder().config(conf).getOrCreate() ;
        import spark.implicits._


        //解析评级
        def parseRating(str: String): Rating0 = {
            val fields = str.split("::")
            assert(fields.size == 4)
            Rating0(fields(0).toInt, fields(1).toInt, fields(2).toFloat, fields(3).toLong)
        }
        //转换成Rating的DF对象
        var ratings = spark.sparkContext.textFile("file:///E:/Code/LearningBigData/spark-09-case/src/File/sample_movielens_ratings.txt");
        val ratings0 = ratings.map(parseRating)
        val df = ratings0.toDF()
        //随机切割训练数据,生成两个一个数组,第一个元素是training,第二个是test
        val Array(training, test) = df.randomSplit(Array(0.99, 0.01))

        //建ALS推荐算法并设置参数
        val als = new ALS().setMaxIter(5)
            .setRegParam(0.01)
            .setUserCol("userId")
            .setItemCol("movieId")
            .setRatingCol("rating")
        //通过als对象对训练数据进行拟合,生成推荐模型
        val model = als.fit(training)
        //使用model对test数据进行变换,实现预测过程
        val predictions = model.transform(test);

        predictions.collect().foreach(println)

    }
}

推荐结果:

[17,78,1.0,1424380312,1.0239189]
[20,91,1.0,1424380312,1.2133352]
[25,37,1.0,1424380312,4.280719]
[3,88,4.0,1424380312,3.8389754]
[13,4,2.0,1424380312,2.278469]
[2,39,5.0,1424380312,-2.0068724]
[4,45,1.0,1424380312,0.89084613]
[6,33,1.0,1424380312,1.1651201]
[5,71,1.0,1424380312,1.107135]
[20,79,1.0,1424380312,2.1340065]
[22,66,1.0,1424380312,0.78094494]
[22,36,3.0,1424380312,3.41729]
↓↓↓ 打开微信关注我的微信公众号 ↓↓↓

会打篮球的程序猿

领取精品免费学习资料哦~
正文到此结束
本文目录