SparkSession 是DataSet和DataFrame编写Spark程序的入口
SparkSession的功能:
- 创建DataFrame
- 以关系型数据库中表的形式生成DataFrame,之后便可以执行SQL语句,适合小数据量的操作
- 读取.parquet格式的文件,得到DataFrame
创建SparkSession对象:
>>> spark = SparkSession.builder \
.master("local") \
.appName("Word Count") \
.config("spark.some.config.option", "some-value") \
.getOrCreate()
Builder:SparkSession的构造器:
appName(name):
给应用设置一个名称,可在Spark的web界面上显示.如果名称已占用,则会随机生成一个.
界面地址默认为localhost:4040
config(key=None, value=None, conf=None)
配置项,在创建SparkSession和SparkConf时都会被隐式地调用
对于一个已创建的SparkConf对象,使用conf参数
>>> from pyspark.conf import SparkConf
>>> SparkSession.builder.config(conf=SparkConf())
<pyspark.sql.session...
使用键值对传参时可隐藏参数名
>>> SparkSession.builder.config("spark.some.config.option", "some-value")
<pyspark.sql.session...
参数:
- key ——– 配置信息的键
- value ——– 配置信息的值
- conf ——– SparkConf实例
enableHiveSupport()
提供Hive支持,可以连接到统一的Hive元数据,支持Hive serdes和Hive自定义函数
(2.0版本新增)
getOrCreate()
获取已存在的SparkSession实例,若不存在则根据构造器的配置内容创建一个
(2.0版本新增)
若存在一个默认切有效的全局SparkSession实例的情况下,该方法返回已存在的SparkSession实例;若不存在,则创建一个SparkSession实例并将其标记为全局默认的
>>> s1 = SparkSession.builder.config("k1", "v1").getOrCreate()
>>> s1.conf.get("k1") == s1.sparkContext.getConf().get("k1") == "v1"
True
对已存在的SparkSession对象的配置项进行修改,新的配置和之前的配置同时有效
>>> s2 = SparkSession.builder.config("k2", "v2").getOrCreate()
>>> s1.conf.get("k1") == s2.conf.get("k1")
True
>>> s1.conf.get("k2") == s2.conf.get("k2")
True
master(master)
设置要连接的Spark主节点URL,"local"表示在本地运行,"local[4]"表示在本地调用4个核心运行,"spark://master:7077"表示单节点运行
(2.0版本新增)
参数:
- master ——– Spark主节点的URL
SparkSession.builder =<pyspark.sql.session.Builder object at 0x7fc358d6e250>
SparkSession.catalog
一个接口,用户可以通过这个接口对底层的数据库,表,函数等进行增删改查操作
(2.0版本新增)
SparkSession.conf
Spark运行时的配置接口,用户可以通过这个接口获取与Spark SQL相关的所有Spark和Hadoop配置项,同时也可以对这些配置进行修改.当要获取配置信息时,默认返回底层SparkContext设置(如果存在的话)
(2.0版本新增)
SparkSession.createDataFrame(data, schema=None, samplingRatio=None,verifySchema=True)
根据一个RDD,list或者pandas.DataFrame生成DataFrame
若schema为列名组成的list,Spark会根据每个列的值来推断类型
若schema为None,Spark将根据每个列的值来推断类型和列名,可以为RDD的Row,nametuple或dict
若schema为pyspark.sql.types.DataType或表示datatype的字符串,必须与真实的数据相匹配,否则运行时将抛出异常.若schema不为pyspark.sql.types.StructType,它将作为唯一的域封装为StructType,并且域的名称为"value",每条记录都会被封装进tuple,随后转换为row.
如果需要确定schema,samplingRatio将被用来确定用于schema推断的rows的比例.
(2.0版本新增,...2.1版本中增加了verifySchema参数)
翻译的太烂了,以后加深理解再回来翻译一遍吧.....( T___T )
参数:
- data ——– 由结构化SQL数据表示的RDD,list或pandas.DataFrame
- schema ——– (这一段的翻译没怎么看懂,以后再翻)
- samplingRatio ——–(同上)
- verifySchema ——– 针对schema确定每个row的数据类型
返回值:
DataFrame
>>> l = [('Alice', 1)]
>>> spark.createDataFrame(l).collect()
[Row(_1=u'Alice', _2=1)]
>>> spark.createDataFrame(l, ['name', 'age']).collect()
[Row(name=u'Alice', age=1)]
>>> d = [{'name': 'Alice', 'age': 1}]
>>> spark.createDataFrame(d).collect()
[Row(age=1, name=u'Alice')]
>>> rdd = sc.parallelize(l)
>>> spark.createDataFrame(rdd).collect()
[Row(_1=u'Alice', _2=1)]
>>> df = spark.createDataFrame(rdd, ['name', 'age'])
>>> df.collect()
[Row(name=u'Alice', age=1)]
>>> from pyspark.sql import Row
>>> Person = Row('name', 'age')
>>> person = rdd.map(lambda r: Person(*r))
>>> df2 = spark.createDataFrame(person)
>>> df2.collect()
[Row(name=u'Alice', age=1)]
>>> from pyspark.sql.types import *
>>> schema = StructType([
... StructField("name", StringType(), True),
... StructField("age", IntegerType(), True)])
>>> df3 = spark.createDataFrame(rdd, schema)
>>> df3.collect()
[Row(name=u'Alice', age=1)]
>>> spark.createDataFrame(df.toPandas()).collect()
[Row(name=u'Alice', age=1)]
>>> spark.createDataFrame(pandas.DataFrame([[1, 2]])).collect()
[Row(0=1, 1=2)]
>>> spark.createDataFrame(rdd, "a: string, b: int").collect()
[Row(a=u'Alice', b=1)]
>>> rdd = rdd.map(lambda row: row[1])
>>> spark.createDataFrame(rdd, "int").collect()
[Row(value=1)]
>>> spark.createDataFrame(rdd, "boolean").collect()
Traceback (most recent call last):
...
Py4JJavaError: ...
SparkSession.newSession()
创建一个新的SparkSession会话,该会话有独立的SQLConf,临时视图和自定义函数,但共享SparkContext和已缓存的表
(2.0版本新增)
SparkSession.range(start, end=None, step=1, numPartitions=None)
创建一个只有一列的DataFrame,列数据的类型为pyspark.sql.types.LongType,列名为'id',该列的值为[start,end),步长默认为1
(2.0版本新增)
参数
- start ——– 下限
- end —— 上限
- step ——– 步长
- numPartitions ——– DataFrame的分区数
>>> spark.range(1, 7, 2).collect()
[Row(id=1), Row(id=3), Row(id=5)]
这个range的生成方式跟python相同
>>> spark.range(3).collect()
[Row(id=0), Row(id=1), Row(id=2)]
SparkSession.read
返回一个DataFrameReader,可用于读取多种格式的文件,生成DataFrame
(2.0版本新增)
SparkSession.readStream
用于读取数据流生成流式DataFrame,还处于实验阶段
(2.0版本新增)
SparkSession.sparkContext
返回底层sparkContext
(2.0版本新增)
SparkSession.sql(sqlQuery)
将sql语句对应的查询结果以DataFrame的形式返回
(2.0版本新增)
>>> df = spark.createDataFrame([{'name':'cjh','id':158},{'name':'cjhjh','id':159}])
>>> df.createOrReplaceTempView("table1")
>>> df2 = spark.sql("SELECT name AS f1, id as f2 from table1")
>>> df2.collect()
[Row(f1='cjh', f2=158), Row(f1='cjhjh', f2=159)]
SparkSession.stop()
终止底层SparkContext,释放资源
(2.0版本新增)
SparkSession.streams
返回一个StreamQueryManager,管理所有的StreamingQuery
(2.0版本新增)
SparkSession.table(tableName)
将临时视图以DataFrame的形式返回
(2.0版本新增)
>>> df.createOrReplaceTempView("table1")
>>> df2 = spark.table("table1")
>>> sorted(df.collect()) == sorted(df2.collect())
True
SparkSession.udf
返回SparkSession.udf,用于创建自定义函数
(2.0版本新增)
SparkSession.version
当前Spark的版本号
(2.0版本新增)