Pyspark使用笔记

本博客记录了学习Pyspark的笔记。Pyspark是Spark的Python接口。

Pyspark结构

整个程序由11个公共类加4个模块组成。如下图所示:
spark架构图

  • SparkContext: 集群功能入口
  • RDD: 弹性分布式数据集(基本抽象类)
  • Broadcast: 广播变量,跨task共享变量
  • Accumulator: 累加器,仅可累加的的共享变量
  • SparkConf: 配置Spark环境
  • Sparkfiles: 提供获取集群文件的抽象类方法
  • StorageLevel: 控制持久化等级
  • Taskcontext: 获取当前运行任务的信息
  • 基于barrier类:提供barrier execution方式,便于将Spark与MPI分布式机器学习作业有机结合起来

RDD

RDD是一组不可变的JVM(java虚拟机)对象的分布集,是一种无schema的数据结构,因此几乎可以混合使用任何结构的数据来创建RDD。
一个Spark应用可以简单理解为对RDD的一系列操作,Spark内置了很多算子,以实现对RDD的操作,通常可分为transformation以及action算子。transformation算子并不立即执行,一旦碰到action算子才真正开始计算,因此针对RDD的操作是惰性的(参考博文)。

###################RDD操作示例###################
from pyspark import SparkConf, SparkContext

conf = SparkConf().setAppName('TEST').setMaster('local')  # 创建配置
sc = SparkContext(conf=conf)  # 创建Spark环境
# data_rdd = sc.parallelize(['a', 'b', 'c', 'd'])  # 根据list,array创建RDD
# 读取文件系统中的文件,创建RDD, 逐行读取,每行相当于list中的一个元素,第二个参数为分区个数
data_rdd = sc.textFile(r'.\learningPySpark-master\Data\airport-codes-na.txt', 4)
data_map = data_rdd.map(lambda row: row.split('\t'))  # map函数相当于一个转换器,对RDD中每个元素进行转换操作
data_filter = data_map.filter(lambda row: row[2] == "USA")  # 根据要求筛选数据
data_flatmap = data_rdd.map(lambda row: row.split('\t'))  # flat意思就是多维转一维,所有行合并成一行
res_dis = data_map.map(lambda row: row[2]).distinct().collect()  # distinct去重
data_sample = data_flatmap.sample(True, 0.02)  # 随机抽取一定比例(不严格)的样本,True代表有放回

SQL & DataFrame

Pyspark中的DataFrame是一种被组织成列的不可变分布式数据集。通过在分布式数据集上施加结构,spark用户能够采用类似操作Pandas中DataFrame的方式或SQL方式对分布式数据进行操作。值得注意的是,Pyspark中的DataFrame虽然与Pandas中的近似,但其存储方式悬殊,要操作数据还得采用Pyspark的方法,也可以用toPandas()转化为Pandas中的DataFrame再用Pandas方法操作数据。
关于Pyspark中对DataFrame的操作需要注意几点:

  1. Pyspark中DataFrame不可变,故不像Pandas中有inplace参数,换句话说其inplace只能是False
  2. 函数的操作虽大部分与Pandas相似,但某些时候更像Pandas与SQL的结合体,比如select的使用
  3. 若要使用SQL语句,需提前根据DataFrame建立表或视图,并注册函数
###################Spark SQL与 DataFame ###################
from pyspark.sql import SparkSession, Row
from pyspark.sql.types import *
from pyspark.sql import functions as F

# 创建SQL及DataFrame功能入口
spark = SparkSession.builder.master("local").appName("Word Count") \
    .config(conf=SparkConf()) \
    .getOrCreate()

# 本地直接创建DataFrame
df1 = spark.createDataFrame([('Eric', 25), ('Alice', 21)], schema=['name', 'age']).collect()  # 根据list或dict创建

df_rdd = spark.sparkContext.parallelize([('Eric', 25), ('Alice', 21)])
schema = StructType([StructField("name", StringType(), True), StructField("age", IntegerType(), True)])
df2 = spark.createDataFrame(df_rdd, schema=schema).collect()  # 根据RDD创建并指定字段数据类型

Person = Row('name', 'age')
person = df_rdd.map(lambda r: Person(*r))  # 将RDD内每个元素转化为Row实例
df3 = spark.createDataFrame(person)

# 读取源数据创建DataFrame
df_jdbc = spark.read.jdbc(url="jdbc:mysql://***.***.***.***:3306/test",
                          table='titanic_test',
                          properties={'user': '***', 'password': '***'})  # 读取mysql数据库表
df_parquet = spark.read.parquet()  # 读取parquet格式的数据, 同理可读取csv,json, text, table, schema文件
df_json = spark.read.format('json').load()  # 或采用load方法

# DataFrame持久化
df1.write.json()
df1.write.format('parquet').save()  # 保存的文件是一个不可修改的文件夹

# DataFrame操作,操作函数名大部分与Pandas相同,以下列举部分不相同的操作函数
df_jdbc.describe().show()  # 简单统计
df_jdbc.select(['Pclass', 'Age']).show()  # 列索引
df_jdbc.filter(df_jdbc['Sex'] == 'male').show()  # 行筛选(没有索引切片操作)
df_jdbc.sort(df_jdbc['Pclass'].desc(), df_jdbc['Age'].asc()).show()  # 排序
df_jdbc.agg({'Name': 'count', 'Age': 'mean'}).collect()  # 聚合操作
df_jdbc.withColumn('FamilySize', df_jdbc['SibSp'] + df_jdbc['Parch'])  # 添加新列
df_jdbc.withColumnRenamed('Pclass', 'class')  # 重命名列名
df_jdbc_alias = df_jdbc.alias('df_jdbc_alias')  # 返回新的DataFrame,并重命名,相当于复制
df_jdbc.toDF()  # 数据类型转化操作,还有toJson等。也可以用来全部重命名列名
df_jdbc.select(F.split(df_jdbc['Name'])[0]).show(3)  # 对单列施加函数操作

# sql操作,需要先创建表或视图
df_jdbc.createGlobalTempView('titanic')  # 创建全局临时视图(持续到应用结束), createTempView则持续SparkSession结束
df_jdbc.registerTempTable('titanic_temp')  # 创建临时表,其生命周期与createTempView相同
df_table = spark.sql('select * from global_temp.titanic')
spark.udf.register('strlen', lambda s: len(s))  # 注册自定义函数,以便使用sql语句
spark.sql('select strlen(Name) from global_temp.titanic').collect()

提交任务

通常在本地测试后,就要提交到集群中去,需要注意以下几点:

  1. 注明编码方式
  2. 采用spark-submit提交任务时,命令行参数将覆盖程序内的参数
    WordCount.py示例如下:
#!/usr/bin/python
# _*_ coding: utf-8 _*_


from pyspark import SparkContext, SparkConf
import sys


def run(input_path):
    conf = SparkConf().setMaster("spark://127.0.0.1:7077").set("spark.executor.memory", "1g")
    sc = SparkContext(conf=conf)
    rdd = sc.textFile(input_path)
    rdd_map = rdd.flatMap(lambda x: x.split('\t')).map(lambda x: (x, 1))
    rdd_red = rdd_map.reduceByKey(lambda x, y: x + y).sortBy(lambda x: x[1], False)
    print(rdd_red.collect())
    sc.stop()
    return


if __name__ == "__main__":
    input_path = sys.argv[1]
    run(input_path)

# 提交到yarn集群: spark-submit --master yarn WordCount.py hdfs:///user/slx/airport-codes-na.txt

参考资料

Pyspark官方参考文档
Spark中与Pandas中DataFrame的对比
Spark Overview

About This Book, Learn why and how you can efficiently use Python to process data and build machine learning models in Apache Spark 2.0Develop and deploy efficient, scalable real-time Spark solutionsTake your understanding of using Spark with Python to the next level with this jump start guide, Who This Book Is For, If you are a Python developer who wants to learn about the Apache Spark 2.0 ecosystem, this book is for you. A firm understanding of Python is expected to get the best out of the book. Familiarity with Spark would be useful, but is not mandatory., What You Will Learn, Learn about Apache Spark and the Spark 2.0 architectureBuild and interact with Spark DataFrames using Spark SQLLearn how to solve graph and deep learning problems using GraphFrames and TensorFrames respectivelyRead, transform, and understand data and use it to train machine learning modelsBuild machine learning models with MLlib and MLLearn how to submit your applications programmatically using spark-submitDeploy locally built applications to a cluster, In Detail, Apache Spark is an open source framework for efficient cluster computing with a strong interface for data parallelism and fault tolerance. This book will show you how to leverage the power of Python and put it to use in the Spark ecosystem. You will start by getting a firm understanding of the Spark 2.0 architecture and how to set up a Python environment for Spark., You will get familiar with the modules available in PySpark. You will learn how to abstract data with RDDs and DataFrames and understand the streaming capabilities of PySpark. Also, you will get a thorough overview of machine learning capabilities of PySpark using ML and MLlib, graph processing using GraphFrames, and polyglot persistence using Blaze. Finally, you will learn how to deploy your applications to the cloud using the spark-submit command., By the end of this book, you will have established a firm understanding of the Spark Python API and how it can be used t
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值