pyspark.sql.SQLContext:DataFrame和SQL功能的主要入口点.
1:pyspark.sql.SQLContext
1.1 class pyspark.sql.SQLContext(sparkContext, sqlContext=None)
SQLContext用来创建DataFrame、注册DataFrame为表、在表上执行SQL、缓存表、读取parquet文件。
参数:●sparkContext - 支持sqlcontext的sparkcontext
●sqlContext - 一个可选的JVM Scala sqlcontext,若设置,我们不需要在JVM实例化一个新的sqlcontext,而是都调用这个对象.
1.2 applySchema(rdd, schema):在1.3中已过时,使用createDataFrame()代替.
1.3 cacheTable(tableName):在内存中缓存指定的表.版本1.0中的新功能.
1.4 clearCache():从内存缓存中删除所有缓存表,版本1.3中的新功能.
1.5 createDataFrame(data, schema=None, samplingRatio=None):版本1.3中的新功能.
从tupe/list组成的rdd 或list或pandas.DataFrame创建DataFrame
当schema是列名的列表时,每个列的类型会从数据中推断出来。
当schema是None时,将尝试从数据中推断模式(列名和类型,数据应该是an rdd of row, or namedtuple, or dict.。
如果schema推理是必要的,samplingRatio用来确定用于模式推理的行比率。如果没有samplingratio,将使用第一行。
参数:●data - an RDD of Row/tuple/list/dict, list, or pandas.DataFrame.
●schema – 一个结构化类型或者列名列表,默认是空。
samplingRatio – 用于推断的行的样本比率。
返回: DataFrame
# 来源于spark文档中的官方实例测试
from pyspark import SparkContext,SparkConf
from pyspark.sql import HiveContext
from pyspark.sql import SQLContext
from pyspark.sql import Row
from pyspark.sql.types import *
from pyspark.sql import functions as F
from pyspark.sql.functions import *
from pyspark.sql.functions import col
sqlContext = conf = SparkConf().setAppName("the apache sparksql")
sc = SparkContext(conf=conf)
>>> l = [('Alice', 1)]
>>> sqlContext.createDataFrame(l).collect()
[Row(_1=u'Alice', _2=1)]
>>> sqlContext.createDataFrame(l, ['name', 'age']).collect()
[Row(name=u'Alice', age=1)]
>>> d = [{'name': 'Alice', 'age': 1}]
>>> sqlContext.createDataFrame(d).collect()
[Row(age=1, name=u'Alice')]
>>> rdd = sc.parallelize(l)
>>> sqlContext.createDataFrame(rdd).collect()
[Row(_1=u'Alice', _2=1)]
>>> df = sqlContext.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 = sqlContext.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 = sqlContext.createDataFrame(rdd, schema)
>>> df3.collect()
[Row(name=u'Alice', age=1)]
>>> sqlContext.createDataFrame(df.toPandas()).collect()
[Row(name=u'Alice', age=1)]
>>> sqlContext.createDataFrame(pandas.DataFrame([[1, 2]])).collect()
[Row(0=1, 1=2)]
1.5 createExternalTable(tableName, path=None, source=None, schema=None, **options):版本1.3中的新功能.
基于数据源中的数据集创建外部表.
返回与外部表关联的dataframe.
数据源由source和一组options指定。如果未指定源,那么将使用由spark.sql.sources.default 配置的默认的数据源配置。
一个模式可以被提供作为返回的DataFrame的模式,然后创建外部表。
Returns:dataframe
1.6 registerDataFrameAsTable(df, tableName):版本1.3中的新功能.
注册给定的DataFrame作为目录中的临时表。
临时表只在当前SQLContext实例有效期间存在。
1.7 dropTempTable(tableName):版本1.6中的新功能.
从目录中删除临时表.
>>>sqlContext.registerDataFrameAsTable(df,"table1")
>>>sqlContext.dropTempTable("table1")
1.8 getConf(key, defaultValue):版本1.3中的新功能.
返回Spark SQL的配置属性值
入职值没有设定则返回默认值.
classmethod getOrCreate(sc):版本1.6中的新功能.
获取现有的SQLContext或使用给定的SparkContext创建一个新的SQLContext。
Parameters:sc – SparkContext
setConf(key, value):版本1.3后的新功能.
设置给定的Spark SQL配置属性
1.9 inferSchema(rdd, samplingRatio=None):在版本1.3中已过时,使用createDataFrame()代替.
1.10 jsonFile(path, schema=None, samplingRatio=1.0):在版本1.4中已过时,使用DataFrameReader.json()代替. 从一个文本文件中加载数据,这个文件的每一行均为JSON字符串.
sqlContext.jsonFile('python/test_support/sql/people.json').dtypes[('age', 'bigint'), ('name', 'string')]
1.11 jsonRDD(rdd, schema=None, samplingRatio=1.0)
从一个已经存在的RDD中加载数据,这个RDD中的每一个元素均为一个JSON字符串。
如果提供了模式,将给定的模式应用到这个JSON数据集。否则,它根据数据集的采样比例来确定模式。
1.12 load(path=None, source=None, schema=None, **options):1.4版本中已过时,使用DataFrameReader.load()代替.返回数据源中的数据集为DataFrame.
1.13 newSession():版本1.6中的新功能.
返回一个新的SQLContext做为一个新的会话,这个会话有单独的SQLConf,注册临时表和UDFs,但共享sparkcontext和缓存表。
1.14 parquetFile(*paths):版本1.4中已过时,使用DataFrameReader.parquet()代替.
加载Parquet文件,返回结果为DataFrame
1.15 range(start, end=None, step=1, numPartitions=None):
创建只有一个名为id的长类型的列的DataFrame,包含从开始到结束的按照一定步长的独立元素。
参数:●start - 开始值
●end - 结束值
●step - 增量值(默认:1)
●numPartitions – DataFrame分区数
返回: DataFrame
sqlContext.range(1,7,2).collect()
1.16 read:版本1.4中的新功能.
返回一个DataFrameReader,可用于读取数据为DataFrame。
Returns:DataFrameReader
1.17 registerFunction(name, f, returnType=StringType):版本1.2后的新功能
注册python方法(包括lambda方法),作为UDF,这样可以在 SQL statements中使用。
除了名称和函数本身之外,还可以选择性地指定返回类型。当返回类型没有指定时,默认自动转换为字符串。对于任何其他返回类型,所生成的对象必须与指定的类型匹配。
参数:● name - UDF名称
● f – python方法
● 返回类型 数据类型对象
>>> sqlContext.registerFunction("stringLengthString",lambdax:len(x))
>>> sqlContext.sql("SELECT stringLengthString('test')").collect()[Row(_c0=u'4')]
>>> frompyspark.sql.typesimportIntegerType
>>> sqlContext.registerFunction("stringLengthInt",lambdax:len(x),IntegerType())
>>> sqlContext.sql("SELECT stringLengthInt('test')").collect()[Row(_c0=4)]
1.18 sql(sqlQuery):New in version 1.0.
返回DataFrame代表给定查询的结果
>>>l=[(1,'row1'),(2,'row2'),(3,'row3')]
>>>df = sqlContext.createDataFrame(l['field1','field2'])
>>>sqlContext.registerDataFrameAsTable(df,"table1")
>>>df2 = sqlContext.sql("SELECT field1 AS f1, field2 as f2 from table1")
>>> df2.collect()
[Row(f1=1, f2=u'row1'), Row(f1=2, f2=u'row2'), Row(f1=3, f2=u'row3')]
1.19 table(tableName)
返回指定的表为DataFrame
>>>l=[(1,'row1'),(2,'row2'),(3,'row3')]
>>>df = sqlContext.createDataFrame(l,['field1','field2'])
>>>sqlContext.registerDataFrameAsTable(df,"table1")
>>>df2 = sqlContext.table("table1")
>>>sorted(df.collect()) == sorted(df2.collect())
1.20 tableNames(dbName=None) :New in version 1.3.
返回数据库的表名称列表
参数:dbName – 字符串类型的数据库名称.默认为当前的数据库。
返回: 字符串类型的表名称列表
>>> sqlContext.registerDataFrameAsTable(df,"table1")
>>> "table1"insqlContext.tableNames()True
>>> "table1"insqlContext.tableNames("db")True
1.21 tables(dbName=None):版本1.3后新出的功能.
返回给定的数据库包含表名称的DataFrame。
如果数据库名没有指定,将使用当前的数据库。
返回的DataFrame包含两列: 表名称和是否临时表 (一个Bool类型的列,标识表是否为临时表)。
参数:● dbName – 字符串类型的使用的数据库名
返回: DataFrame
>>> sqlContext.registerDataFrameAsTable(df,"table1")
>>> df2=sqlContext.tables()
>>> df2.filter("tableName = 'table1'").first()
Row(tableName=u'table1', isTemporary=True)
1.22 udf:版本1.3.1新出的功能
返回一个注册的UDF为UDFRegistration.
返回: UDFRegistration
1.23 uncacheTable(tableName):版本1.0新出的功能
从内存的缓存表中移除指定的表.