pyspark介绍
spark简介
Apache Spark是一个闪电般快速的实时处理框架。 它进行内存计算以实时分析数据。 由于Apache Hadoop MapReduce仅执行批处理并且缺乏实时处理功能,因此它开始出现。 因此,引入了Apache Spark,因为它可以实时执行流处理,也可以处理批处理。
除了实时和批处理之外,Apache Spark还支持交互式查询和迭代算法。 Apache Spark有自己的集群管理器,可以托管其应用程序。 它利用Apache Hadoop进行存储和处理。 它使用HDFS (Hadoop分布式文件系统)进行存储,它也可以在YARN上运行Spark应用程序。
pyspark理解
Apache Spark是用Scala编写的。 为了用Spark支持Python,Apache Spark社区发布了一个工具PySpark。 使用PySpark,您也可以使用Python编程语言中的RDDs 。 正是由于一个名为Py4j的库,他们才能实现这一目标。Py4j其实就是python for java的简写,表示用python🧍♀嫁接用java写的scala。
PySpark提供了PySpark Shell ,它将Python API链接到spark核心并初始化Spark上下文。 今天,大多数数据科学家和分析专家都使用Python,因为它具有丰富的库集。 将Python与Spark集成对他们来说是一个福音。
说白了,pyspark就是用python连接你本地与spark集群的桥。这个集群可以部署在远程也可以部署在本机。pyspark的服务逻辑是通过SparkContext实现的,如下图:
编码过程就是实例化一个SparkContext类,通过这个类的方法实现并行计算、查询等操作。世纪参数如下
class pyspark.SparkContext ( master = None,
appName = None,
sparkHome = None,
pyFiles = None,
environment = None,
batchSize = 0,
serializer = PickleSerializer(),
conf = None,
gateway = None,
jsc = None,
profiler_cls = <class 'pyspark.profiler.BasicProfiler'> )
以下是SparkContext的参数。
- Master - 它是连接到的集群的URL。
- appName - 您的工作名称。
- sparkHome - Spark安装目录。
- pyFiles - 要发送到集群并添加到PYTHONPATH的.zip或.py文件。
- Environment - 工作节点环境变量。
- batchSize - 表示为单个Java对象的Python对象的数量。 设置1以禁用批处理,设置0以根据对象大小自动选择批处理大小,或设置为-1以使用无限批处理大小。
- Serializer - RDD序列化器。
- Conf - L {SparkConf}的一个对象,用于设置所有Spark属性。
- Gateway - 使用现有网关和JVM,否则初始化新JVM。
- JSC - JavaSparkContext实例。
- profiler_cls - 用于进行性能分析的一类自定义Profiler(默认为pyspark.profiler.BasicProfiler)。
常见用法如下,表示连接本地与服务的集群:
from pyspark import SparkContext
sc = SparkContext("local", "First App")
进一步查询服务器的数据库,用法如下
sql = """select
from
where
"""
hiveContext = HiveContext(sc)
df = hiveContext.sql(sql)
得到一个spark类型的DataFrame累,区别于RDD的格式,DF支持表操作,不支持map等操作。
RDD类;
class pyspark.RDD (
jrdd,
ctx,
jrdd_deserializer = AutoBatchedSerializer(PickleSerializer())
)
因此,可以进行格式转化,转换为RDD支持map、reduce等操作
pred = df.rdd
pred=pred.map(lambda)
RDD格式支持的一些函数:
pred.count(lambda) #计数符合函数的值
pred.map(lambda) #对每一行执行函数
pred.take(int) #取出rdd的前int个值
pred.collect() #返回所有存储在集群上的rdd值到本地
pred.foreach(lambda) #对每一个元素执行lambda操作
pred.filter(lambda) #对每一行执行函数,返回符合函数的值
pred.reduce(lambda) #对rdd执行函数操作,此函数操作要求联系多行,有连接性
pred..reduceByKey(lambda x, y: x + y) #加和操作,表示其中x列相同的元素合并为一个元素
pred.join(other) #表示对另一个rdd做拼接操作,相通的key的value会合并
pred.cache() #表示在缓存保存这个rdd