写在前面

做了两个周的大数据实验,每天6个小时花费在上面,虽然有时感觉很痛苦,但是实验下来却收获满满,感觉非常充实。感觉到痛苦其实是因为有一名划水的队友,在这里实名diss xyc;其次是因为每天晚上在B站看沙雕视频看到2,3点,睡眠严重不足。总的来说,这个实验让我有了一种做了一个项目的感觉,了解了大数据在工程中是如何应用的。

学会的东西

Scala

照着指导书上的代码敲,最终还让我把第四个实验给写完了。模仿加查资料,学会了一点点Scala,虽然很水,勉强知道类型推断,还有Anything is String!最大的收获还是坚定了学习Scala的决心,这将是我第一门函数式 + 面向对象语言(C++只会STL)。Scala呢,主要是学习了一些基础的语法,比如list如何相加等。以及将dataframe直接导入MySql,这个操作真的是有爽到,省了很多时间以及不用使用Sql语句。贴一下整个Scala的代码。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
package org.zkpk.lab

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{SQLContext, _}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.types.{DoubleType, IntegerType, StringType, StructField, StructType}
import java.util.Properties

object test1 {

	def main (args: Array[String]): Unit = {
		val conf = new SparkConf().setAppName("test1")
		val sc = new SparkContext(conf)
		sc.setLogLevel("ERROR")
		val sqlContext = new SQLContext(sc)

		val df = sqlContext.load("com.databricks.spark.csv",Map("path" -> "hdfs://master:9000/TrainingSet.csv", "header" -> "True"))

		val sd = df.select("EndDay", "QuantitySold")

		val vec = sd.collect()

		val dayto = Map("Monday" -> 0,"Tuesday" -> 1,"Wednesday" -> 2,"Thursday" -> 3,"Friday" -> 4,"Saturday" -> 5,
			"Sunday" -> 6)

		val today = Map(0 -> "Monday",1 -> "Tuesday", 2 -> "Wednesday" ,3 -> "Thursday",4 -> "Friday" ,5 -> "Saturday",
			6 -> "Sunday")

		var TRnumSucc = new Array[Int](7)
		var TRnumFail = new Array[Int](7)


		for (i <- 0 to (vec.length-1)) {
			val x = vec(i)(1).toString
			val y = x.toInt
			if (y == 1) {
				val tp = vec(i)(0).toString
				val tmp = dayto(tp)
				TRnumSucc(tmp) = TRnumSucc(tmp) + 1
			}
			else {
				val tp = vec(i)(0).toString
				val tmp = dayto(tp)
				TRnumFail(tmp) = TRnumFail(tmp) + 1
			}
		}

		var TEnumSucc = new Array[Int](7)
		var TEnumFail = new Array[Int](7)


		val df2 = sqlContext.load("com.databricks.spark.csv",Map("path" -> "hdfs://master:9000/TestSet.csv", "header" -> "True"))

		val sd2 = df2.select("EndDay", "QuantitySold")

		val vec2 = sd2.collect()

		for (i <- 0 to (vec2.length-1)) {
			val x = vec2(i)(1).toString
			val y = x.toInt
			if (y == 1) {
				val tp = vec2(i)(0).toString
				val tmp = dayto(tp)
				TEnumSucc(tmp) = TEnumSucc(tmp) + 1
			}
			else {
				val tp = vec2(i)(0).toString
				val tmp = dayto(tp)
				TEnumFail(tmp) = TEnumFail(tmp) + 1
			}
		}



		var list1: List[(String,Int)] = List()
		var list2: List[(String,Int)] = List()

		for (i <- 0 to 6) {
			val lst: List[(String,Int)] = List((today(i),TRnumSucc(i)))
			list1 = list1 ++ lst
		}

		for (i <- 0 to 6) {
			val lst: List[(String,Int)] = List((today(i),TEnumSucc(i)))
			list2 = list2 ++ lst
		}

		var list3: List[(String,Double)] = List()
		var list4: List[(String,Double)] = List()

		for (i <- 0 to 6) {
			val x = 1.0 * TRnumSucc(i) / (TRnumSucc(i) + TRnumFail(i))
			val lst: List[(String,Double)] = List((today(i),x))
			list3 = list3 ++ lst
		}

		for (i <- 0 to 6) {
			val x = 1.0 * TEnumSucc(i) / (TEnumSucc(i) + TEnumFail(i))
			val lst: List[(String,Double)] = List((today(i),x))
			list4 = list4 ++ lst
		}

		var lists: List[(String,Double)] = List()

		for (i <- 0 to 6) {
			var x = 1.0 * TRnumSucc(i) / (TRnumSucc(i) + TRnumFail(i)) - 1.0 * TEnumSucc(i) / (TEnumSucc(i) + TEnumFail(i))
			if (x < 0) x = -x
			val lst: List[(String,Double)] = List((today(i),x))
			lists = lists ++ lst
		}

		val prop = new Properties()
		prop.setProperty("driver","com.mysql.jdbc.Driver")
		prop.put("user","root")
		prop.put("password","zkpk")

		val url = "jdbc:mysql://localhost:3306/sales"

		val schema1 = StructType(
			List(
				StructField("Days",StringType,true),
				StructField("Num",IntegerType,true)
			)
		)

		val rowRDD1 = sc.makeRDD(list1).map(x=>Row(x._1,x._2))

		val data1=sqlContext.createDataFrame(rowRDD1,schema1)

		data1.write.mode("overwrite").jdbc(url,"TrainNum",prop)


		val rowRDD2 = sc.makeRDD(list2).map(x=>Row(x._1,x._2))

		val data2=sqlContext.createDataFrame(rowRDD2,schema1)

		data2.write.mode("overwrite").jdbc(url,"TestNum",prop)

		val schema2 = StructType(
			List(
				StructField("Days",StringType,true),
				StructField("Suc_Percent",DoubleType,true)
			)
		)

		val rowRDD3 = sc.makeRDD(list3).map(x=>Row(x._1,x._2))

		val data3=sqlContext.createDataFrame(rowRDD3,schema2)

		data3.write.mode("overwrite").jdbc(url,"TrainPercent",prop)


		val rowRDD4 = sc.makeRDD(list4).map(x=>Row(x._1,x._2))

		val data4=sqlContext.createDataFrame(rowRDD4,schema2)

		data4.write.mode("overwrite").jdbc(url,"TestPercent",prop)


		val schema3 = StructType(
			List(
				StructField("Days",StringType,true),
				StructField("Suc_Percent",DoubleType,true)
			)
		)

		val rowRDD5 = sc.makeRDD(lists).map(x=>Row(x._1,x._2))

		val data5=sqlContext.createDataFrame(rowRDD5,schema3)

		data5.write.mode("overwrite").jdbc(url,"Difference",prop)

		sc.stop()
	}

}

Maven

因为做实验的时候用到了这个东西,所以上知乎学习了一波。这是一个相当于项目管理器的东西,其中最方便的地方在于处理依赖问题。通过将要引入的依赖写入一个pom文件当中而进行统一管理,然后自动从中央仓库当中拉取依赖。这个思想确实是具有非常大的意义。

python

因为要用python进行可视化展示,所以又模仿着指导书学了点python,不过也是很水的那种。。。主要学习的其实就是用pandas以及matplotlib绘图。因为没有系统学习,所以就只贴一下参考资料,以后应该是会进行系统学习的。

1.matplotlib绘图——柱状图

2.Python绘制精美图表之双柱形图

DataFrame

这是一个贯穿主线的东西。因为不管是Scala处理csv文件,还是python读取MySql,又或者是pandas画图,都用到了这个东西。这个东西其实是一个相当于二维表的东西,你给它定义表头,填充数据,然后就可以当一个二维表使用了。当时我是参考的Spark-SQL之DataFrame操作大全

在Scala处理csv的时候,有一个库可以直接读取csv并且将其转变为dataframe。一开始其实我是直接用vim把表头删了然后手动构造dataframe,然后同学跟我说将来遇到几百个T的文件就相当于破坏了原始数据,复制不太现实,我一想,确实是这样,然后就重做了,搜索如何处理表头,就搜到了这个库,参考资料请看使用Spark读写CSV格式文件]。在绘图的时候,需要将dataframe转化成为二维数组才能够进行处理,所以又进行了dataframe和list以及array的转换的操作,参考了以下资料,Pandas将列表(List)转换为数据框(Dataframe),以及将pandas中Dataframe数据转换为二维数组array

浅谈对大数据的认识

本质还是计算,只不过是把计算分到了更多的机器上从而加速计算。master节点作为管理节点,slave节点充当计算节点,当然还有资源节点等。伪分布式是无法表现出大数据所带来的优势的,后面估计会考虑买几台vps来试试水。