pyspark是Spark的PythonAPI
几个重要的类
Spark的RDD编程
- SparkConf
用来配置Spark,SparkConf直接设置的任何参数优先于系统属性。
常用的方法:
- setMaster:设置要连接的主url
- setAppName:设置应用的名称
- set:设置配置属性(以字典的形式)。将其他的set**方法写进一个字典
- SparkContext
SparkContext是Spark功能的入口
SparkContext()的初始化方法可以以参数来配置Spark,但是他首先会查找conf参数;conf参数对应的是SparkConf()类中的配置,然后调用方法确检测,确保SparkContext只在驱动程序上创建;最后得到一个SparkContext对象(sc)
通过parallelize()
或者textFile()
方法返回一个RDD对象
parallelize:自己传入数据,然后返回一个RDD对象
textFile:读取文件(HDFS,本地系统等)编码必须是UTF-8的,返回一个RDD对象
- RDD
Resilient distributed data sets 弹性分布式数据集
RDD类中有很多转换方法,每个方法得到的内容不可修改;
而且只有用到行动操作,RDD才开始执行之前一系列的转换(惰性求值)
RDD是Spark Core的数据抽象,由SparkContext得到
SparkSQL
DataFrame是SparkSQL的数据抽象
- SparkSession
SparkSession是DataFrame和SQL功能的主要入口
SparkSession初始化方法中传入SparkContext的对象,用于配置Spark参数得到SparkSession对象;
最后的调用不懂!
def __init__(self, sparkContext, jsparkSession=None):
from pyspark.sql.context import SQLContext
self._sc = sparkContext
self._jsc = self._sc._jsc
self._jvm = self._sc._jvm
if jsparkSession is None:
if self._jvm.SparkSession.getDefaultSession().isDefined() \
and not self._jvm.SparkSession.getDefaultSession().get() \
.sparkContext().isStopped():
jsparkSession = self._jvm.SparkSession.getDefaultSession().get()
else:
jsparkSession = self._jvm.SparkSession(self._jsc.sc())
self._jsparkSession = jsparkSession
self._jwrapped = self._jsparkSession.sqlContext()
self._wrapped = SQLContext(self._sc, self, self._jwrapped)
_monkey_patch_RDD(self)
install_exception_handler() # 把该对象.toDF就能得到DataFrame格式
这里的调用
_monkey_patch_RDD(self)
def _monkey_patch_RDD(sparkSession):
def toDF(self, schema=None, sampleRatio=None):
return sparkSession.createDataFrame(self, schema, sampleRatio)
RDD.toDF = toDF
或者使用SparkSession.builder.config(conf=conf).getOrCreate()
conf是Spark的配置选项
两种方式都是为了得到SparkSession对象
得到了SparkSession对象后
可以用SparkSession对象调用.createDataFrame(RDD对象)得到DataFrame数据类型
或者RDD对象调用.toDF()方法,得到DataFrame数据类型(toDF方法内部也是用createDataFrame(RDD对象)实现的)
在创建DF的时候要指定表头,表头可以在设置RDD转换操作的时候用Row来指定
或者在创建DF的时候指定表头列表
# method1
rdd = employeeText.map(lambda x:x.split(",")).map(lambda x:Row(id=int(x[0]),name=x[1],age=int(x[2])))
schemaPeople = spark.createDataFrame(rdd)
# method2
rdd = employeeText.map(lambda x:x.split(","))
schemaPeople = spark.createDataFrame(rdd,["id","name","age"])
schemaPeople2 = rdd.toDF(["id","name","age"])