因为最近开始了毕业设计,而我是数据清洗的,所以遇到了很多以前没见过的问题记录一下
数据:
2000-01-03 | 0.157039 | ||
2000-01-04 | 0.476351 | 0.157385 | |
2000-01-05 | 0.474555 | 0.158185 | |
2000-01-06 | 0.476826 | 0.158 | |
2000-01-07 | 0.475459 | 0.158729 | |
2000-01-10 | 0.477253 | 0.158769 | |
2000-01-11 | 0.477417 | 0.158702 | |
2000-01-12 | 0.478853 | 0.158575 | |
2000-01-13 | 0.482539 | 0.158833 | |
2000-01-14 | 0.485601 | 0.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
我觉得他讲的还可