pyspark.sql.SparkSession
作用:创建DF、将DF注册为一张table,在table上执行sql,读取列式存储文件(parquet格式)
- 注意parquet文件是一种以列式结构存储的数据,基于自己的理解,这种格式把数据转化为(r,d,value)能够压缩数据,在读取存储是可以加快速度,适合于我们开发过程中中间数据的存储再读取。
创建方式
from pyspark.sql import SparkSession
#创建
spark=SparkSession.bulider.getOrCreate()
-
事实上,SparkSession,SparkContext ,SQLContext,HiveContext在看文档时,发现这些类的方法重合度很高,感觉功能大多数类似。https://blog.csdn.net/qq_21383435/article/details/77371142 介绍了SparkSession 和其他几种差别。
-
*总结区别是:SparkSession 是spark 2.0 为用户提供的统一的操作入口,SparkContext,SQLContext,HiveContext 能实现的功能,SparkSession 全部要包含。因此建议在写程序时,若版本达到2.0的情况,请使用SparkSession 操作。
SparkSession method
createDataFrame (data,schema)
-
其中data 可以是一个list,rdd,或者pandas 中的DF
-
schema 可以为空,或者列名,或者显示的定义前面data的类型。
-
注意 定义data 类型使用的方法:使用 pyspark.sql.types中的类型
-
schema需要声明 StructType,由一个StructField的列表组成,StructFiled的数据结构为:(string,dataType,nullable,metaData),举个栗子:
-
data=[(“zhaoli”,25),(“zhaoxiaoli”,18)] 我们要转化的是一个以(string,int)为元素的list,因此在声明schema时需要声明一个string的StructField和一个int型的StrucField .
-
from pyspark.sql.types import *
data=[("zhaoli",25),("zhaoxiaoli",18)]
schema=StructType([StructField("name",StringType(),nullable=True),\
StructField("age",IntegerType(),nullable=True)]\
)
pyspark.sql.types 的所有类型
-
NullType 是一个类名,因此StructField中声明时,需要将其实例化,同理其他类型
-
StringType
-
BooleanType
-
TimestampType
-
IntegerType ,LongType, FloatType ,ArrayType ,MapType
df、table转化 使用spark.table1 转化为df
df.createOrReaplaceTempView("table1")
df=spark.table("table1")
pyspark.sql.DataFrame
- 可以通过SparkSession 创建得到dataframe,或者rdd.toDF()
method of DataFrame
agg 聚合操作
- 举个栗子:
from pyspark.sql import functions as F
df.agg(F.min(df.age),F.max(df.age),F.sum(),F.count(),F.avg(),F.countDistinct())
agg中的函数需要按照pyspark.sql.functions中的方法。(处理的时column类型)