本文记录spark开发过程中遇到的小知识点,使用pyspark开发,由于使用大多数场景为DataFrame,介绍也多为DataFrame。本文比较长,在学习过程中摘了一些博客和资料,如果有描述的不对的地方请指出。
Spark是分布式内存计算,能够依据各类操作创建一个计算DAG图,数据通过DAG处理后生成结果。
对spark的数据操作分为两类,一类是转换(transformation)操作,比如Filter、map、flatMap、reduce等,但是这些操作是懒转换,只在action的时候才真正的对数据做处理;另一类是action为操作,比如collect、show、count、first等,它们能够触发数据的计算得到结果。
数据集分为RDD、DataFrame、DataSet,其中DataFrame可以看做带格式的RDD,(因为格式确定,所以处理计算效率高于RDD),对DataFrame的操作可以视为对一张数据表操作,由于数据集的不可变特性,不能够修改原有DataFrame,而只能创建新的DataFrame,如增加列生成新的DF,删减列生成新的DF等。由于对DataFrame类似于表,spark提供了SQL的方式进行计算和操作,很多计算可以直接通过SQL的方式解决掉。
注意,虽然PySpark中也叫DataFrame,但是其与Pandas的DataFrame的很多操作不一样,虽然有很多类似之处。
1. 常用的引入包
from pyspark.sql import Row
from pyspark.sql.functions import col, isnan, isnull
from pyspark.sql import SparkSession # SparkConf、SparkContext 和 SQLContext 都已经被封装在 SparkSession
from pyspark.sql.types import *
2. 创建spark
# 创建spark 如果是pypsark的话,直接用内置的spark变量
spark = SparkSession.builder.appName('test pyspark').getOrCreate()
3. 创建DataFrame
# 通过读取数据集来创建DataFrame
# 1. 参考本文档读取操作
# 2. 通过RDD
client_rdd = spark.sparkContext.parallelize([
('20180701', '1111', 0.1),
('20180801', "1111", 0.2),
('20180901', "1111", 0.3),
])
client_schema = StructType([
StructField("date", StringType(), True),
StructField("client_id", StringType(), True),
StructField("cash", DoubleType(), True)
])
client_df = spark.createDataFrame(client_rdd, client_schema)
4. Pandas与PySpark的DataFrame
# pandas DataFrame 与 pyspark的DataFrame相互转化
pandas_df = spark_df.toPandas() # spark df转pandas df
spark_df = spark.createDataFrame(pandas_df.values.tolist(), list(pandas_df.columns)) # pandas df转spark df
spark_df = spark.createDataFrame(pandas_df) # pandas df转spark df
5. DataFrame基础操作
5.1查看DataFrame
# 查看DataFrame
df.show(5, False)
df.first()
df.head(5)
df.take(5)
df.collect() # 将df整体以list的形式返回,不要在大数据集的情况用这种方法
df.collectAsMap() # ?
df.count() # 统计df的行数
df.schema # df的结构
df.printSchema() # 树的形式打印df的结构
df.columns # 查看列名
5.2缓存DataFrame
# 缓存df,对于多次调用一些小的数据集,如果不缓存,则在计算的时候会多次加载,缓存能提高效率
df.cache