【大数据框架及实战1】---spark基础课
第一节 spark简介
1. spark是什么?
1.apache spark是一个统一的计算引擎和一组类库,使用spark处理数据比传统方式快100倍。
2.并不是单台电脑上spark比python快100倍,主要是spark主要用在计算机群集(集群对程序来说不是3个 5个的机器,而是一个大机器,由集群软件实现)上进行并行数据处理。
3.spark是当前最活跃的开源引擎,是对大数据感兴趣的任何开发人员或数据科学家的标准工具。
2. spark架构图
spark的dataframe与python的是一样的,但是此处的dataframe可以跨到多个机器上去。
3. spark的安装下载
安装前注意:确保电脑上安装了java, 且 python 3.7 本节课使用spark 2.4.5。
安装包:可加微信要安装包。
安装步骤如下:
1.安装jdk
2.设置环境变量—JAVA_HOME变量
JAVA_HOME= D:\SoftInStall\java\jdk1.8
3.安装 winutils 设置----HADOOP_HOME变量设置
HADOOP_HOME =D:\SoftInStall\winutils
4.解压缩spark包 设置SPARK_HOME变量
SPARK_HOME=D:\SoftInStall\spark-2.4.5
5.在系统的path变量中 把刚才的三个设置全部激活。
6.重要把系统python 3.8 调整为3.7。
(1)打开python确定版本。
(2)cmd根目录下运行
- 创建虚拟环境:
conda create -n sparkenv2 python=3.7
-n 为名字的意思,即sparkenv2为一个名字。 - 激活环境:
conda activate sparkenv2
关闭环境 conda deactivate
conda env list 可以查看当前的多少环境。 - 以下软件安装在sparkenv2 这个虚拟环境中:
pip install jupyter numpy pandas matplotlib findspark
7.进入spark虚拟环境。
pyspark
ctrl+z 退出环境。
第二节 spark的RDD(弹性分布式数据)
1.RDD(resilient distributed dataset),指的是一个只读的,可分区的分布式数据集,这个数据集的全部或者部分可以缓存在内存中,在多次计算间重用。
resilient 可复活的,一个机器挂掉后,数据可以在其他机器上复活。
2.它是一种有容错机制的特殊集合,可以分布在集群节点上,以函数式编程操作集合的方式,进行各种并行操作。
1. RDD创建
#配置spark需要的环境
import findspark
findspark.init()
#激活本机的spark环境
import pyspark
#导入spark需要的环境(SparkConf和SparkContext),然后加载数据。
from pyspark import SparkConf,SparkContext
sc=SparkContext(conf=SparkConf().setAppName("gm").setMaster("local"))
lines=sc.textFile("word_count.text",3) #lines是一个rdd
#spark中的take类似于df中的head
lines.take(1)
2. flatMap使用统计单词出现的频率
利用spark的功能来实现统计 这个文件中有多少单词,单词出现的频率
#逐行处理在spark中有三个主要功能
一行进 一行出 使用 map功能
一行进 少于一行出 filter 功能
一行进 多行出 flatmap功能
1.map 进来一个出去一个
2.flatMap 把每一行进行数据处理,输出的结果可以是一行也可以是多行。
3.filter 过滤
words=lines.flatMap(lambda x :x.split(" ")) #每行进行按空格分割单词
wordcounts=words.countByValue()
wordcounts.items()
flatMap能干什么?原来的python是一个处理器一行一行的处理,其他处理器休息。现在分为3份。占用3个处理器同时工作,3份主要干什么取决于flatMap括号内的内容。(比如食堂原来有1个窗口,现在10个窗口。spark就是这样一个分布式框架)
3. 数据集合并操作(filter和map)
julyFirstLogs = sc.textFile("nasa_19950701.tsv")
augustFirstLogs = sc.textFile("nasa_19950801.tsv")
julyFirstLogs.count() #输出10000
# 把两个rdd 进行数据合并
aggrLogline = julyFirstLogs.union(augustFirstLogs)
# 1.删除首行
def isNotHeader(line):
return not (line.startswith("host") and "bytes" in line)
cleanlog = aggrLogline.filter(isNotHeader)
# 2.提取所有的ip地址 然后进行数据统计
julyFirstHost = cleanlog.map(lambda x: x.split("\t")[0])
julyFirstHost.take(5)
# 3.统计
ipcounts = julyFirstHost.countByValue()
ipcounts.items()
# 4.数据保存
julyFirstHost.saveAsTextFile('out/hosts')
#保存的文件(spark默认开两个cpu):
4. reduce–归约器
让每个机器先做加法然后每个机器再相加,数据可以分布再不同的机器上。
第三节 spark的dataframe 操作
spark的dataframe 是一种分布式数据集合,是高级API,相对于底层的API RDD拥有更多的功能和数据安全性。
# 启动spark 环境
import findspark
findspark.init()
from pyspark.sql import SparkSession
spark=SparkSession.builder.appName('Dataframe').getOrCreate()
1.Schema 模式
# spark 有类似于df的 数据结构
# inferSchema=True 可以用来推测字段类型
df_pyspark = spark.read.option('header','true').csv('test1.csv',inferSchema=True)
df_pyspark.printSchema() #看字段
df_pyspark.show(5) #show和pandas的head差不读
# 简便方式
df_pyspark=spark.read.csv('test1.csv',header=True,inferSchema=True)
df_pyspark.show()
2.过滤不同列
df_pyspark.select(['Name']).show(5)
3.describe
df_pyspark.describe().show()
4.增加字段
df_pyspark = df_pyspark.withColumn('new',df_pyspark['Experience']+5)
5.删除列
#必须赋予一个值,要不然删除失效
df_pyspark=df_pyspark.drop('new')
6.重命名数据
# 重命名数据 *** 注意
# save和show 功能不可以同时使用 要么采用show 实时显示 要么赋值一下 然后下一行用show
df_pyspark2=df_pyspark.withColumnRenamed('Name','New Name')
df_pyspark2.show()
7.删除空值
pandas 中我们使用 fillna 和 dropna 进行数据空值处理,那么如何删除列中的空值部分?
- df_pyspark.na.drop().show()
- 隐藏模式 采用how 来区别 如何删除空值 how == any
df_pyspark.na.drop(how=“any”).show() - 用thresh=1 一行中可以有多少个有效值
df_pyspark.na.drop(how=“any”,thresh=1).show()
4.当我们删除na 值的时候 是否可以空值在某列上
df_pyspark.na.drop(how=“any”,subset=[‘Age’,‘Salary’]).show() 年龄和薪资是空值的被删除。
8.填充空值
1.df_pyspark.na.fill(0,[‘Experience’,‘age’]).show()
2.以上都是单列或者全局处理, 如果需要进行数据定制化 ,采用如下功能 imputer 引入模块 imputer
from pyspark.ml.feature import Imputer
imputer = Imputer(
inputCols=['age', 'Experience', 'Salary'],
outputCols=["{}_imputed".format(c) for c in ['age', 'Experience', 'Salary']]
).setStrategy("median")
imputer.fit(df_pyspark).transform(df_pyspark).show()
9. 数据类型转换 可以用 withcolum 方法 调取cast 功能
df_pyspark = df_pyspark.withColumn(“age”,df_pyspark.age.cast(‘double’))
10. 条件过滤
1.行筛选
1.df_pyspark.filter("Salary<=20000").show()
2.df_pyspark.filter(df_pyspark['Salary']<=20000).show()
2.行筛选加列筛选
df_pyspark.filter("Salary<=20000").select(['Name','age']).show()
3.多条件筛选
# 多个条件 每个条件 必须放入括号内 ,用 and 或者 or 链接
# spark 中and 是 & or 是 |
df_pyspark.filter((df_pyspark['Salary']<=20000) & (df_pyspark['Salary']>15000) ).show()
11. 数据汇总
使用groupby 功能进行数据汇聚 必须要提供 汇聚功能 例如 求和 平均值 等
1.df_pyspark.groupBy(‘Departments’).sum().show()
2.df_pyspark.groupBy(‘Name’).sum().show()
3.df_pyspark.groupBy(‘Name’).avg().show()
4.df_pyspark.groupBy(‘Departments’).mean().show()
5.多个统计功能:
df_pyspark.groupBy('Departments').agg({'Salary':'mean','Departments':'count'}).show()
第四节 Spark的SQL 操作
df方便与机器学习,SQL不太方便于机器学习,但是每种都有自己的所在的必要性。
.enableHiveSupport() 可以让数据表保存下来 在metastore_db文件夹中。而不是一次性的临时表
import findspark
findspark.init()
from pyspark.sql import SparkSession
# .enableHiveSupport() 可以让数据表保存下来 而不是一次性的临时表
spark = SparkSession.builder.appName('spark-sql').enableHiveSupport().getOrCreate()
df_pyspark=spark.read.json("2015-summary.json")
#创建临时表
spark.read.json("2015-summary.json").createOrReplaceTempView("some_sql_view")
#查询语句
spark.sql("select * from some_sql_view").show()
spark.sql("select DEST_COUNTRY_NAME,ORIGIN_COUNTRY_NAME from some_sql_view").show(3)
#表查看语句
spark.sql("""
SHOW TABLES""").show()
#之前的语句 DEST_COUNTRY_NAME列名
df_pyspark.filter(df_pyspark.DEST_COUNTRY_NAME.like ('S%')).show()
#现在的查询语句
spark.sql("select DEST_COUNTRY_NAME,ORIGIN_COUNTRY_NAME from some_sql_view where DEST_COUNTRY_NAME like 'S%' ").show(3)
# groupby 我们需要 对目的地进行数据汇总 groupby DEST_COUNTRY_NAME 然后计算总和数
spark.sql("""
SELECT DEST_COUNTRY_NAME, sum(count)
FROM some_sql_view GROUP BY DEST_COUNTRY_NAME order by sum(count) desc
""").show()
#创建表 # 刚才的数据都是临时数据 如果我们需要长期使用这个信息 可以创建表而不是临时表
1.spark.sql("""CREATE TABLE flights_csv (
DEST_COUNTRY_NAME STRING,
ORIGIN_COUNTRY_NAME STRING COMMENT "remember, the US will be most prevalent",
count LONG)
USING csv OPTIONS (header true, path '2015-summary.csv')""")
2.spark.sql("""CREATE TABLE flights (
DEST_COUNTRY_NAME STRING, ORIGIN_COUNTRY_NAME STRING, count LONG)
USING JSON OPTIONS (path '2015-summary.json')""")
spark 可以支持多种格式 ,例如 csv json 还有很多数据格式 ,常见的在大数据环境中 ,我们使用parquet,parquet 在大数据环境中 或者云环境中 可以提高性能。放在单机上不会提升性能,放在云环境中可以多台共同存储或者读取。
spark.sql("""CREATE TABLE flights_from_select USING parquet AS SELECT * FROM flights""")
#创建表结构
spark.sql("""CREATE TABLE partitioned_flights USING parquet PARTITIONED BY (DEST_COUNTRY_NAME)
AS SELECT DEST_COUNTRY_NAME, ORIGIN_COUNTRY_NAME, count FROM flights """)
#插入数据
spark.sql("""INSERT INTO flights_from_select
SELECT DEST_COUNTRY_NAME, ORIGIN_COUNTRY_NAME, count FROM flights LIMIT 20""")
#查询
spark.sql("""SELECT * FROM flights_from_select""").show()
#指定分区插入代码块。 PARTITION (DEST_COUNTRY_NAME="UNITED STATES") 代表插入指定的分区
spark.sql("""INSERT INTO partitioned_flights
PARTITION (DEST_COUNTRY_NAME="UNITED STATES")
SELECT count, ORIGIN_COUNTRY_NAME FROM flights
WHERE DEST_COUNTRY_NAME='United States' LIMIT 12
""")
spark.sql("""DESCRIBE TABLE flights_csv""").show()
spark.sql("""SHOW PARTITIONS partitioned_flights""").take(50)
缓存加快器–加快读取数据
spark.sql(""“CACHE TABLE flights”"")
spark.sql(""“select * from flights”"").show(5)
spark.sql(""“UNCACHE TABLE flights”"")
第五节 使用spark进行机器学习数据挖掘
推断多少岁,工作多少年拿多少钱。
加载数据
import findspark
findspark.init()
from pyspark.sql import SparkSession
spark=SparkSession.builder.appName('ML').getOrCreate()
training = spark.read.csv('test1.csv',header=True,inferSchema=True)
training.show()
使用字段选择器选择字段 VectorAssembler
from pyspark.ml.feature import VectorAssembler
featureassembler = VectorAssembler(inputCols=['age','Experience'],outputCol="features")
output = featureassembler.transform(training)
finalized_data = output.select('features','Salary')
导入线性回归模型并对数据进行拆分
from pyspark.ml.regression import LinearRegression
# 把数据拆分成 训练数据和测试数据
train_data,test_data=finalized_data.randomSplit([0.75,0.25])
train_data.show()
test_data.show()
创建模型
regressor=LinearRegression(featuresCol='features',labelCol='Salary')
regressor=regressor.fit(train_data)
regressor.coefficients
regressor.intercept
使用测试集预测相关数据以及判断模型的优劣
# 预测相关数据
pred_results=regressor.evaluate(test_data)
pred_results.predictions.show()
#如果判断模型的优劣
#使用指标系统 r2
trainingSummary = regressor.summary
print("r2: %f" % trainingSummary.r2)