【大数据框架及实战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根目录下运行

  1. 创建虚拟环境:
    conda create -n sparkenv2 python=3.7
    -n 为名字的意思,即sparkenv2为一个名字。
  2. 激活环境:
    conda activate sparkenv2
    关闭环境 conda deactivate
    在这里插入图片描述
    conda env list 可以查看当前的多少环境。
  3. 以下软件安装在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 进行数据空值处理,那么如何删除列中的空值部分?

  1. df_pyspark.na.drop().show()
  2. 隐藏模式 采用how 来区别 如何删除空值 how == any
    df_pyspark.na.drop(how=“any”).show()
  3. 用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)

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值