pyspark指北(未完待续)

226 阅读3分钟

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实现的,如下图:

image.png

编码过程就是实例化一个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