添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

首先,高级 API 剥离了对集群本身的关注,Spark 应用开发者可以专注于应用所要做的计算本身。

其次,Spark 很快,支持交互式计算和复杂算法。

最后,Spark 是一个通用引擎,可用它来完成各种各样的运算,包括 SQL 查询、文本处理、机器学习等,而在 Spark 出现之前,我们一般需要学习各种各样的引擎来分别处理这些需求。(来源百度百科)

park对python语言的支持--->PySpark

Spark对Python语言的支持,重点体现在Python的第三方库: PySpark

PySpark是由Spark官方开发的Python语言第三方库Python开发者可以使用pip程序快速的安装PySpark并像其它三方库那样直接使用。

PySpark库的安装

在命令行中输入: pip install pyspark

使用国内代理镜像网站: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspark

PySpark执行环境入口对象的构建

想要使用PySpark库完成数据处理,首先需要构建一个执行环境入口对象。

PySpark的执行环境入口对象是:类SparkContext的类对象

如何通过代码获得类对象,代码如下:

from pyspark import SparkConf, SparkContext
# 创建SparkConf类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")  # 链式调用,不管调用什么样的方法,返回的都是同一个对象
# 基于SparkConf类对象创建SparkContext对象
sc = SparkContext(conf=conf)
# 打印pyspark的运行版本
print(sc.version)
# 停止SparkContext对象的运行(停止pyspark程序)
sc.stop()

PySpark的编程模型

PySpark的编程,主要分为如下三大步骤:

RDD对象

PySpark支持多种数据的输入,在输入完成后,都会得到一个:RDD类的对象

RDD全称为: 弹性分布式数据集(Resilient Distributed Datasets)

PySpark针对数据的处理,都是以RDD对象作为载体即:

(1)数据存储在RDD内

(2)各类数据的计算方法,也都是RDD的成员方法

(3)RDD的数据计算方法,返回值依旧是RDD对象

Python数据容器转RDD对象

PySpark支持通过SparkContext对象的parallelize成员方法,将list、tuple、set、dict、str转换为PySpark的RDD对象。

from pyspark import SparkConf, SparkContext
# 创建SparkConf类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")  # 链式调用,不管调用什么样的方法,返回的都是同一个对象
# 基于SparkConf类对象创建SparkContext对象
sc = SparkContext(conf=conf)
rdd1 = sc.parallelize([1, 2, 3, 4, 5])  # 列表
rdd2 = sc.parallelize((1, 2, 3, 4, 5))  # 元组
rdd3 = sc.parallelize("study python")  # 字符串
rdd4 = sc.parallelize({1, 2, 3, 4, 5})  # 集合
rdd5 = sc.parallelize({"key1": "value1", "key2": "value2", "key3": "value3"})  # 字典
# 如果要查看RDD里面有什么内容,需要用collect()方法
print(rdd1.collect())
print(rdd2.collect())
print(rdd3.collect())
print(rdd4.collect())
print(rdd5.collect())
# # 停止SparkContext对象的运行(停止pyspark程序)
sc.stop()

(1)字符串会被拆分出1个个的字符,存入RDD对象字典

(2)仅有key会被存入RDD对象

读取文件转RDD对象

PySpark支持通过SparkContext入口对象,来读取文件并构建出RDD对象

前面逻辑都是一样的,只是调用方法不一样,需要使用 sc.textFile

from pyspark import SparkConf, SparkContext
# 创建SparkConf类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")  # 链式调用,不管调用什么样的方法,返回的都是同一个对象
# 基于SparkConf类对象创建SparkContext对象
sc = SparkContext(conf=conf)
rdd = sc.textFile("G:\资料\2011年1月销售数据.txt")
# 如果要查看RDD里面有什么内容,需要用collect()方法
print(rdd.collect())
# # 停止SparkContext对象的运行(停止pyspark程序)
sc.stop()

PySpark的数据计算,都是依赖RDD对象内置丰富的“成员方法(算子)”来进行的

因为spark是一个分布式程序,内部运行机制比较复杂,暂不讨论,我们只需要知道在python中运行spark程序时,需要额外增加以下代码,否则会报错:spark找不到python程序

# 添加'PYSPARK_PYTHON'和'PYSPARK_DRIVER_PYTHON'的执行环境
os.environ['PYSPARK_PYTHON'] = sys.executable  # "E:/python/python.exe"
os.environ['PYSPARK_DRIVER_PYTHON'] = sys.executable  # "E:/python/python.exe"

(1)map方法

功能:将RDD的数据一条条处理,返回新的RDD

语法: rdd.map(fun) # 需要传入一个函数

需求:给 [1,2,3,4,5] 每个数字乘以10

代码如下:

import sys
from pyspark import SparkConf, SparkContext
import os
# 添加'PYSPARK_PYTHON'和'PYSPARK_DRIVER_PYTHON'的执行环境
os.environ['PYSPARK_PYTHON'] = sys.executable  # "E:/python/python.exe"
os.environ['PYSPARK_DRIVER_PYTHON'] = sys.executable  # "E:/python/python.exe"
# 创建SparkConf类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")  # 链式调用,不管调用什么样的方法,返回的都是同一个对象
# 基于SparkConf类对象创建SparkContext对象
sc = SparkContext(conf=conf)
# 需求:通过map方法将全部数据都乘以10
rdd = sc.parallelize([1, 2, 3, 4, 5])
# 把rdd中的每一个数据都调用匿名函数(也可通过def重新定义函数)去处理
rdd2 = rdd.map(lambda x: x * 10)
print(rdd2.collect())
# 停止SparkContext对象的运行(停止pyspark程序)
sc.stop()

(2)flatMap方法

功能:对RDD执行map操作,然后进行解除嵌套操作

# 嵌套的list
list = [[1,2,3],[4,5,6],[7,8,9]]
# 解除了嵌套
list = [1,2,3,4,5,6,7,8,9]

示例代码:

import sys
from pyspark import SparkConf, SparkContext
import os
# 添加'PYSPARK_PYTHON'和'PYSPARK_DRIVER_PYTHON'的执行环境
os.environ['PYSPARK_PYTHON'] = sys.executable  # "E:/python/python.exe"
os.environ['PYSPARK_DRIVER_PYTHON'] = sys.executable  # "E:/python/python.exe"
# 创建SparkConf类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")  # 链式调用,不管调用什么样的方法,返回的都是同一个对象
# 基于SparkConf类对象创建SparkContext对象
sc = SparkContext(conf=conf)
rdd = sc.parallelize(["hello python", "hello word", "hello friend"])
# 需求:将RDD中的每一个单词都提取出来
rdd2 = rdd.flatMap(lambda x: x.split(" "))
print(rdd2.collect())

(3)reduceByKey方法

功能:针对KV型RDD(二元元组),自动按照key分组,然后根据你提供的聚合逻辑,完成组内数据(value)的聚合操作。

rdd.reduceByKey(func)
# func:(V,V)-> V
# 接受2个传入参数(类型要一致),返回一个返回值,类型和传入要求一致。

示例代码:

# 前面创建RDD对象不做赘述了
# 准备一个RDD
rdd = sc.parallelize([('男', 99), ('男', 80), ('男', 70), ('女', 100), ('女', 85)])
# 求男生和女生两个组的成绩之和
rdd2 = rdd.reduceByKey(lambda a, b: a + b)
print(rdd2.collect())

对下面txt文件中的单词进行计数统计

代码如下:

import sys
from pyspark import SparkConf, SparkContext
import os
# 添加'PYSPARK_PYTHON'和'PYSPARK_DRIVER_PYTHON'的执行环境
os.environ['PYSPARK_PYTHON'] = sys.executable  # "E:/python/python.exe"
os.environ['PYSPARK_DRIVER_PYTHON'] = sys.executable  # "E:/python/python.exe"
# 创建SparkConf类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")  # 链式调用,不管调用什么样的方法,返回的都是同一个对象
# 基于SparkConf类对象创建SparkContext对象
sc = SparkContext(conf=conf)
# 读取数据文件
rdd = sc.textFile("G:/hello.txt")
# 读取全部单词
word_rdd = rdd.flatMap(lambda x: x.split(" "))
# 将所有单词都转换成二元元组,单词为key,value设置为1
word_one_rdd = word_rdd.map(lambda word: (word, 1))
# 分组并求和传承传承
result_rdd = word_one_rdd.reduceByKey(lambda a, b: a + b)
print(result_rdd.collect())

(4)filter方法

功能:过滤想要的数据进行保留

rdd.filter(func)
# func: (T)-->bool  传入1个参数进来随意类型,返回值必须是true or false

示例代码:

# 前面创建RDD对象不做赘述了
# 准备一个RDD
rdd = sc.parallelize([1, 2, 3, 4, 5])
# 对RDD的数据进行过滤,偶数返回true,保留偶数
rdd2 = rdd.filter(lambda num: num % 2 == 0)
print(rdd2.collect())

(5)distinct方法

功能:对RDD数据进行去重,返回新RDD

语法: rdd.distinct()

实例代码:

# 前面创建RDD对象不做赘述了
# 准备一个RDD
rdd = sc.parallelize([1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9])
# 对RDD的数据进行去重
rdd2 = rdd.distinct()
print(rdd2.collect())

(6)stortBy方法

功能:对RDD数据进行排序,基于你指定的排序依据

rdd.sortBy(func,ascending=False, numPartitions=1)
# func: (T) -> U: 告知按照rdd中的哪个数据进行排序,比如 lambda x: [1] 表按照rdd中的第二列元素进行排序
# ascending True升序 False 降序
# numPartitions: 用多少分区排序

示例代码:

以上对单词进行计数统计的案例1中,对结果按照单词出现的次数从大到小进行排序

# 对结果进行排序
final_rdd = result_rdd.sortBy(lambda x: x[1], ascending=False, numPartitions=1)
print(final_rdd.collect())

需求:对以下文件使用spark读取文件进行计算:

(1)各个城市销售额排名,从大到小

(2)全部城市,有哪些商品类别在售卖

(3)北京市有哪些商品类别在售卖

案例代码:

import sys
from pyspark import SparkConf, SparkContext
import os
import json
# 添加'PYSPARK_PYTHON'和'PYSPARK_DRIVER_PYTHON'的执行环境
os.environ['PYSPARK_PYTHON'] = sys.executable  # "E:/python/python.exe"
os.environ['PYSPARK_DRIVER_PYTHON'] = sys.executable  # "E:/python/python.exe"
# 创建SparkConf类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")  # 链式调用,不管调用什么样的方法,返回的都是同一个对象
# 基于SparkConf类对象创建SparkContext对象
sc = SparkContext(conf=conf)
# (1)城市销售额排名
# 读取数据文件
file_rdd = sc.textFile("G:/orders.txt")
# 读取文件中单个json字符串
json_str_rdd = file_rdd.flatMap(lambda x: x.split("|"))
# 将单个字符串转换为字典
dict_rdd = json_str_rdd.map(lambda x: json.loads(x))
# 取出城市和销售额数据(城市,销售额)
city_money_rdd = dict_rdd.map(lambda x: (x['areaName'], int(x['money'])))
# 按照城市分组,按照销售额累计
city_result_rdd = city_money_rdd.reduceByKey(lambda a, b: a + b)
# 按照销售额累计结果进行排序
result1_rdd = city_result_rdd.sortBy(lambda x: x[1], ascending=False, numPartitions=1)
print("各个城市销售额排名,从大到小:", result1_rdd.collect())
# (2)全部城市,有哪些商品类别在售卖
category_rdd = dict_rdd.map(lambda x: x['category']).distinct()
print("全部城市,有哪些商品类别在售卖:", category_rdd.collect())
# (3)北京市有哪些商品类别在售卖
beijing_data_rdd = dict_rdd.filter(lambda x: x['areaName'] == '北京')
beijing_category = beijing_data_rdd.map(lambda x: x['category']).distinct()
print('北京市有哪些商品类别在售卖:', beijing_category.collect())

RDD的结果输出为Python对象的各类方法

(1)collect方法

功能:将RDD各个分区内的数据,统一收集到Driver中,形成一个List对象

语法: rdd.collect() ,返回值是一个list

此方法我们前面一直在使用,不做赘述

(2)reduce方法

功能:对RDD数据集按照你传入的逻辑进行聚合

语法: rdd.reduce(func) ,两参数传入,1个返回值,返回值和参数要求类型一致

示例代码:

rdd = sc.parallelize([1, 2, 3, 4, 5])
print(rdd.reduce(lambda a, b: a + b))
# 输出结果为两两相加的值:15

(3)take方法

功能:取RDD的前n个元素,组成list返回

语法: rdd.take(num) ,num代表前几个元素

示例代码:

rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(rdd.take(5))
# 输出结果为:[1, 2, 3, 4, 5]

(4)count方法

功能:计算RDD有多少条数据,返回值是一个数字

用法:rdd.count()

示例代码:

rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(rdd.count())
# 输出结果为:10

关于Spark的方法(算子)还有很多很多,我们目前不是深入学习python语言,同时也没有学习分布式,只是简单学习对自动化测试打下基础,所以本篇文章只介绍了最基础的几个。

将RDD的内容输出到文件中

(5)saveAsTextFile方法

功能:将RDD的数据写入文本文件中,支持本地写出,hdfs( Hadoop 分布式文件系统 )等文件系统。

语法: rdd.saveAsTextFile("../data/output/test.txt")

想要这个方法正常运行,还需要配置Hadoop依赖,自行百度配置

运行之后,内容会存在多个分区中,输出的结果是一个文件夹,有几个分区就输出多少个结果文件

修改RDD分区为1个

方式1:SparkConf对象设置 conf.set("spark.default.parallelism", "1")

方式2:创建RDD的时候,sc.parallelize方法传入numSlices参数为1

# 方式1,SparkConf对象设置属性全局并行度为1:
conf = SparkConf().setMaster("Tocal[*]").setAppName("test_spark")
conf.set("spark.default.parallelism", "1")
sc = SparkContext(conf=conf)
# 方式2, 创建RDD的时候设置(parallelize方法传入numSlices参数为1)
rdd1 = sc.parallelize([1, 2, 3, 4, 5], numSlices=1)
rdd1 = sc.parallelize([1, 2, 3, 4, 5], 1)

最后: 下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取 【保证100%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

Spark 主要有三个特点:首先,高级 API 剥离了对集群本身的关注,Spark 应用开发者可以专注于应用所要做的计算本身。其次,Spark 很快,支持交互式计算和复杂算法。最后,Spark 是一个通用引擎,可用它来完成各种各样的运算,包括 SQL 查询、文本处理、机器学习等,而在 Spark 出现之前,我们一般需要学习各种各样的引擎来分别处理这些需求。(来源百度百科)
本文来自于csdn,这篇文章讲解了 分布式 计算 框架 的核心内容、架构图详解,运用流程等Hadoop是Apache软件基金会所开发的并行 计算 框架 与 分布式 文件系统。最核心的模块包括HadoopCommon、HDFS与MapReduce。HDFSHDFS是Hadoop 分布式 文件系统(HadoopDistributedFileSystem)的缩写,为 分布式 计算 存储提供了底层支持。采用Java语言开发,可以部署在多种普通的廉价机器上,以集群处理数量积达到大型主机处理性能。HDFS架构原理HDFS采用master/slave架构。一个HDFS集群包含一个单独的NameNode和多个DataNode。NameN
在 学习 Spark , 深入 分布式 计算 之前, 我们有必要先体会一下 分布式 计算 的特性和简单原理; 那么我们基于Java去理解, 实现 分布式 的前提是什么呢? 当然是各个主机之间的通信, 即Socket网络通信, 由于Scala引入了大量的Java类库, 自然的也就类似于Java实现Socket通信了; 第一步, Scala实现服务器端 Excutor.scala package simpledistributeddemo import java.io.{InputStream, ObjectInput, .
环境 spark 2.4.5,R3.6, install.package(" Spark R"),默认 spark R提供的函数支持对应的版本为 spark 2.4.5不支持2.4.0 如:将data.table,data.frame dt.score数据集转化成 spark R中的dataframe时可以执行 spark R中提供的方法 spark R默认会覆盖掉R中的方法 如需要调用R中的方法需要指定调用 dataframe作为R和 spark R中的桥梁,不同的是 spark R可以进行分布..
Parallel Python 是一个 python 模块,提供了在SMP(具有多个处理器或核心的操作系统)和群集上并行执行 python 代码的机制。 Parallel Python 具有轻量级、易安装、易与其他 python 软件集成的特性。 Parallel Python 是用纯 Python 语言写的开源跨平台的模块。 Python 代码在集群或SMP上并行执行。
### 回答1: Spark 是一个基于内存的 分布式 计算 框架 ,它可以在大规模数据集上进行快速的数据处理。 Spark 的主要特点是速度快、易用性高、支持多种编程语言和数据源,并且可以与 Hadoop 集成使用。 Spark 的核心是 RDD(Resilient Distributed Datasets,弹性 分布式 数据集),它是一个可分区、可并行 计算 、可容错的数据集合。 Spark 还提供了丰富的 API,包括 Spark SQL、 Spark Streaming、MLlib 和 GraphX 等,可以满足不同的数据处理需求。 Spark 的 分布式 计算 模型基于 DAG(Directed Acyclic Graph,有向无环图)执行引擎,可以实现高效的数据处理和 计算 。 Spark 的应用场景包括数据挖掘、机器 学习 、图 计算 、实时数据处理等。 ### 回答2: Spark 是一种流行的开源 分布式 计算 框架 ,它用于处理大量数据。 Spark 的主要目标是提高大规模数据处理的速度,并增强数据处理的可伸缩性、容错性和易用性。 Spark 的主要特点是它可以将数据集分成多个部分,并通过 分布式 计算 来处理这些数据。 Spark 支持多种数据源,如 Hadoop HDFS、Cassandra、HBase 和 Amazon S3 等,因此灵活性强。 Spark 的核心库是 Spark Core,它提供了 分布式 任务调度、内存管理和错误恢复等核心功能。同时 Spark 也提供了各种扩展库,如 Spark SQL、 Spark Streaming、 Spark MLlib 和 GraphX 等,用于处理不同类型的数据。 Spark 采用 RDD(弹性 分布式 数据集)模型进行数据处理。RDD 代表一个分区的不可变数据集,可以并行处理在 分布式 环境中存储的数据。RDD 具有弹性、不可变、分区、可持久化等特性,可以有效地支持各种数据处理操作,如 map、reduce、filter、join 等等。 除了 RDD 模型, Spark 还支持DataFrame 和 DataSet 模型。DataFrame 是一种类似于关系型数据库表的数据结构,它具有优秀的优化性能和易用性。DataSet 模型是 DataFrame 的超集,它提供了静态类型检查和面向对象的编程接口等更高级的功能。 Spark 可以使用多种编程语言编写,在 Java、Scala 和 Python 等语言中都可以使用 Spark 。同时, Spark 也支持在 YARN、Mesos 和 Kubernetes 等多种资源管理平台上运行。对于 Spark 用户而言,几乎可以无缝切换各种编程语言和资源管理平台。 总之, Spark 是一个非常重要和流行的 分布式 计算 框架 ,它在大数据处理领域具有广泛的应用和积极的社区支持,也正在不断地发展壮大。 ### 回答3: Spark 是一款基于内存的 分布式 计算 框架 ,被认为是目前最流行的大数据 计算 框架 之一。它不仅能够执行批处理作业,而且还可以处理流式数据和机器 学习 等任务。与 Hadoop MapReduce 相比, Spark 的优势主要在于速度。 Spark 采用了 RDD(Resilient Distributed Datasets)模型,可以自动将数据划分为多个分区并在多个节点上并行 计算 ,从而实现高效的 计算 。RDD 可以在内存中缓存,减少了输入/输出的操作,同时也减少了磁盘 I/O 的使用。此外, Spark 还支持针对 RDD 转换和操作的各种 API,包括 map、reduce、filter、join 等常见操作。这使得开发人员可以轻松地构建复杂的数据流和算法。 Spark 还提供了许多组件和库,包括 Spark Streaming、 Spark SQL 和 MLlib 等,为不同的任务提供了不同的解决方案。 Spark Streaming 可以用于流处理, Spark SQL 可以用于 SQL 查询,而 MLlib 则提供了各种机器 学习 算法和工具。 总之, Spark 是一个快速、易于使用和高度可扩展的 分布式 计算 框架 ,是大数据行业的热门技术之一。它可以用于处理各种形式的数据并执行各种任务,无论是批处理还是流处理,还是机器 学习 ,都可以使用 Spark 轻松处理。