从零开始学习Spark环境搭建简单Demo
Posted 小周编程日记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始学习Spark环境搭建简单Demo相关的知识,希望对你有一定的参考价值。
零基础从bilibili学习,是尚硅谷的Spark公开教程
教程地址:https://www.bilibili.com/video/BV11A411L7CK?p=11&spm_id_from=pageDriver
本文分为三块介绍:1.Spark简介 2.Spark环境搭建 3.第一个Demo:WordCount
(一)Spark和Hadoop的区别
Hadoop job之间是通过磁盘,趋向于一次计算,出现较早,有HBase作为数据库 Spark是通过内存,趋向于实时计算,基于内存,出现比Hadoop晚一点,没有数据库两者都是大数据框架
(二)环境搭建
-
Spark主流使用Scala开发,IDEA需要安装Scala插件 -
官方网站下载scala包 -
引入Spark的Maven依赖
一、安装IDEA插件
二、下载Scala包
-
下载的是2.12.13版本
-
通过Project导入下载好的包
三、引入maven依赖
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
(三)WordCount样例学习
给两个文件,文件内有字符串文本,要求对字符串分隔出单词,然后聚合统计每个单词出现的次数
方法一、基础方法
-
读取文件,读出数据行 -
分词,对数据行分成一个个单词 -
分组,将相同单词分到同一组 -
转换,计算出同一组的数目 -
打印
object Spark01_WordCount {
def main(args: Array[String]): Unit = {
// 1. 建立和Spark框架的连接
val sparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
val sc = new SparkContext(sparkConf)
// 2. 执行业务操作
// 2.1 读取文件,数据行读取
val lines: RDD[String] = sc.textFile(path = "datas/*")
// 2.2 分词 扁平化:将整体拆分成个体
val words: RDD[String] = lines.flatMap(_.split(" "))
// 2.3 分组
val wordGroup: RDD[(String, Iterable[String])] = words.groupBy(word => word)
// 2.4 转换
val wordToCount = wordGroup.map {
case (word, list) => {
(word, list.size)
}
}
// 2.5 采集到控制台
val array: Array[(String, Int)] = wordToCount.collect()
array.foreach(println)
// 3. 关闭连接
sc.stop()
}
}
方法二、利用聚合思想,提前对于每一个词设定统计值为1
-
读取文件,读出数据行 -
分词,对数据行分成一个个单词 -
初始化,对每一个单词,初始化值为1 -
分组,将相同单词分到同一组 -
转换,归并求和 -
打印
object Spark02_WordCount {
def main(args: Array[String]): Unit = {
// 1. 建立和Spark框架的连接
val sparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
val sc = new SparkContext(sparkConf)
// 2. 执行业务操作
// 2.1 读取文件,数据行读取
val lines: RDD[String] = sc.textFile(path = "datas/*")
// 2.2 分词 扁平化:将整体拆分成个体
val words: RDD[String] = lines.flatMap(_.split(" "))
// 2.3 初始化
val wordToOne = words.map(
word => (word, 1)
)
// 2.4 分组
val wordGroup: RDD[(String, Iterable[(String, Int)])] = wordToOne.groupBy(t => t._1)
// 2.5 转换
val wordToCount = wordGroup.map {
case (word, list) => {
list.reduce(
(t1, t2) => {
(t1._1, t1._2 + t2._2)
}
)
}
}
// 2.6 采集到控制台
val array: Array[(String, Int)] = wordToCount.collect()
array.foreach(println)
// 3. 关闭连接
sc.stop()
}
}
方法三、使用Spark的API,分组聚合函数(reduceByKey)
-
读取文件,读出数据行 -
分词,对数据行分成一个个单词 -
初始化,对每一个单词,初始化值为1 -
分组聚合,将相同单词分到同一组 -
打印
object Spark03_WordCount {
def main(args: Array[String]): Unit = {
// 1. 建立和Spark框架的连接
val sparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
val sc = new SparkContext(sparkConf)
// 2. 执行业务操作
// 2.1 读取文件,数据行读取
val lines: RDD[String] = sc.textFile(path = "datas/*")
// 2.2 分词 扁平化:将整体拆分成个体
val words: RDD[String] = lines.flatMap(_.split(" "))
// 2.3 初始化
val wordToOne = words.map(
word => (word, 1)
)
// 2.4
// Spark:分组和聚合可以使用一个方法实现——reduceByKey:相同的key,可以对value进行reduce聚合
// 自简原则 如果参数只被使用一次,可以使用下划线代替
val wordToCount: RDD[(String, Int)] = wordToOne.reduceByKey(_ + _)
// 2.5 采集到控制台
val array: Array[(String, Int)] = wordToCount.collect()
array.foreach(println)
// 3. 关闭连接
sc.stop()
}
}
以上是关于从零开始学习Spark环境搭建简单Demo的主要内容,如果未能解决你的问题,请参考以下文章
mybatis学习笔记 -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)