理解SparkSession

 

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版本新增)

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值