spark线性回归

        因为最近开始了毕业设计,而我是数据清洗的,所以遇到了很多以前没见过的问题记录一下

数据:

2000-01-030.157039
2000-01-040.4763510.157385
2000-01-050.4745550.158185
2000-01-060.4768260.158
2000-01-070.4754590.158729
2000-01-100.4772530.158769
2000-01-110.4774170.158702
2000-01-120.4788530.158575
2000-01-130.4825390.158833
2000-01-140.4856010.158855

因为我们的项目是分析疫情对世界经济的影响爬下来的有着大量的空值,所以我真的会谢,他们叫我用线性回归补全。哎

解释:

        因为我在之前就把数保存到了hive,所以读取的是hive的数据

        数据预测不可以以空值开始不然预测的值是负数,于是我把有空值的和没空值的进行分类

        df1没空值df2包含null转换成了0,

        然后rdd转化成df(数据要进行测试得精确所以用的是todouble)

        然后的我的注释解释的很清楚

def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession
      .builder()
      .appName("test01")
      .master("local[*]")
      .enableHiveSupport()
      .getOrCreate()
//

    spark.sql("use byrpp_ods")
    val df1 = spark.sql(
      """
        |select `id`,`Algerian dinar   (DZD)` from all_Initial_data1
        |where `Algerian dinar   (DZD)` != 'null'
        |""".stripMargin)
//      .show()
    val df2 = spark.sql(
      """
        |select `id`,`Algerian dinar   (DZD)` from all_Initial_data1
        |""".stripMargin)

//      .show()
//      .createOrReplaceTempView("A")
    val value = df1.rdd.map(linx => {
      linx.mkString(",")
    })
    val itemR1 = value.map(lins => {
      val strings = lins.split(",")
        (strings(0).toInt, strings(1).toDouble)
    })
//      .foreach(println)



    val value2 = df2.rdd.map(linx => {
      linx.mkString(",")
    })
    val itemR2 = value2.map(lins => {
      val strings = lins.split(",")
            if (strings(1)=="null" ){
              strings(1) = "0"
              (strings(0).toInt, strings(1).toDouble)
      //        (strings(0).toInt, strings(2).toDouble)
                    }
      (strings(0).toInt, strings(1).toDouble)

    })


//
      .foreach(println)
//
    val dff = spark.createDataFrame(itemR1).toDF("x", "y")
    val dff1 = spark.createDataFrame(itemR2).toDF("x", "y")

//
//
//    数据预测
    val vectorAss = new VectorAssembler()
      .setInputCols(Array("x")) //指定自变量名
      .setOutputCol("aaa") //为所以自变量起别名
    val frame = vectorAss.transform(dff)
//
    val vectorAss1 = new VectorAssembler()
      .setInputCols(Array("x")) //指定自变量名
      .setOutputCol("aaa") //为所以自变量起别名
    val frame1 = vectorAss1.transform(dff1)
//
//
    val regression = new LinearRegression()
      .setFeaturesCol("aaa") //告诉模型那些是自变量
      .setLabelCol("y") //告诉模型因变量
      .setFitIntercept(true) //计算截距
      .fit(frame) //    代入数据进行建模
  
//    println(regression.coefficients) //查看自变量系数
//    println(regression.intercept)  //查看截距系数

    val framee = regression.transform(frame1)
    framee.show()

如果看不懂的话可以去哔哩哔哩看一位up主的视频

https://www.bilibili.com/video/BV1yp4y1U7nT?spm_id_from=333.880.my_history.page.click

我觉得他讲的还可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值