在使用Spark程序的时候,采用的是Maven导入相应的数据包. Maven的依赖关系如下,因为只做了最简单的算子部分,利用JDBC连接Mysql数据库失败,问题还在排查中,因此暂时就先不展示从MySQL读取数据之后再进行计算的过程了,在后续的文章中将进行连接之后的操作.需要注意的是本文是在单机操作的,系统和编译环境如下
- 操作系统 Mac OS X 10.14.6
- IDE: IDEA社区版
具体配置截图如下
-
Project SDK Java 12
-
Scala 2.12.7
POM文件配置
<groupId>org.example</groupId>
<artifactId>spark_test1</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>3.1.2</version>
<!-- <scope>provided</scope>-->
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-mllib -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_2.12</artifactId>
<version>3.1.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
配置完环境以及POM文件,就开始运行了,初始化
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SparkSession
import org.apache.spark._
import org.apache.spark.rdd.RDD
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.functions._
object firstDemo{
Logger.getLogger("org").setLevel(Level.ERROR)
def main(args: Array[String]): Unit = {
//初始化
val conf = new SparkConf().setAppName(firstDemo.getClass.getSimpleName).setMaster("local")
val sc = new SparkContext(conf)
//最后阶段释放计算资源
sc.stop()
}
首先进行简单的元素统计
val list = List("Hadoop","Spark","Flink","Flink")
val listData = sc.parallelize(list)
//前3个元素
listData.take(3).foreach(println)
//前4个元素
listData.top(4).foreach(println)
//元素统计
println(listData.count())
//长度大于5的元素
listData.filter(_.length > 5).foreach(println)
接下来就是文本的mapping关系,本文简单介绍,暂时未从系统中读文件
val list = List("Hadoop","Spark","Flink")
//使用parallelize生成RDD
val listData = sc.parallelize(list)
//生产tuple,这一点类似于Map reduce过程
val pair:RDD[(String,Int)] = listData.map((_,1))
pair.foreach(print)
输出
使用groupByKey进行统计
listData.map((_,1)).groupByKey().map(t => (t._1,t._2.sum)).foreach(println)
接下来我们使用MapValue进行简单的一些操作
val groupBykey = pair.groupByKey().map(t => (t._1,t._2.sum)).map(t => (t._1,t._2 * 2)).collect()
groupBykey.foreach(print)
}
在很多文章中,推荐使用reduceByKey替代groupByKey,优化原因都讲的很清楚,可以参考别的文章
listData.map((_,1)).reduceByKey(_+_).foreach(println)
使用flatMap,映射每个元素到多个元素
listData.flatMap(x => 0 to x.length ).foreach(println)
上面简单介绍就结束了,后续继续使用Spark做一些简单计算