pyspark中的DataFrame等价于Spark SQL中的一个关系表。在pyspark中,DataFrame由Column和Row构成。

  • pyspark.sql.SparkSession:是DataFrame和SQL函数的主要入口
  • DataFrameReader:读取数据,返回DataFrame
  • DataFrameWriter:把DataFrame存储到其他存储系统
  • pyspark.sql.DataFrame、pyspark.sql.Column和 pyspark.sql.Row

一,SparkSession类

在操作DataFrame之前,首先需要创建SparkSession,通过SparkSession来操作DataFrame。

1,创建SparkSession

通过Builder类来创建SparkSession,在Databricks Notebook中,spark是默认创建,表示一个SparkSession对象:

spark = SparkSession.builder \
.master("local") \
.appName("Word Count") \
.config("spark.some.config.option", "some-value") \
.getOrCreate()

函数注释:

master(master):用于设置要连接的Spark的master URL,例如local表示在本地运行,local[4] 在本地使用4核运行,

appName(name):为application设置一个名字

config(key=None, value=None, conf=None):设置SparkSession的配置选项,

getOrCreate():获得一个已存在的或者创建一个新的SparkSession

2,从常量数据中创建DataFrame

从RDD、list或pandas.DataFrame 创建DataFrame:

createDataFrame(data, schema=None, samplingRatio=None, verifySchema=True)

3,从SQL查询中创建DataFrame

从一个给定的SQL查询或Table中获取DataFrame,举个例子:

df.createOrReplaceTempView("table1")

#use SQL query to fetch data
df2 = spark.sql("SELECT field1 AS f1, field2 as f2 from table1") #use table to fetch data
df2 = spark.table("table1")

4,属性

read:该属性是DataFrameReader 对象,用于读取数据,返回DataFrame对象

readStream:该属性是DataStreamReader对象,用于读取Data Stream,返回 流式的DataFrame对象( streaming DataFrame)

二,DataFrameReader类

从外部存储系统中读取数据,返回DataFrame对象,通常使用SparkSession.read来访问,通用语法是先调用format()函数来指定输入数据的格式,后调用load()函数从数据源加载数据,并返回DataFrame对象:

df = spark.read.format('json').load('python/test_support/sql/people.json')

对于不同的格式,DataFrameReader类有细分的函数来加载数据:

df_csv = spark.read.csv('python/test_support/sql/ages.csv')
df_json = spark.read.json('python/test_support/sql/people.json')
df_txt = spark.read.text('python/test_support/sql/text-test.txt')
df_parquet = spark.read.parquet('python/test_support/sql/parquet_partitioned') # read a table as a DataFrame
df = spark.read.parquet('python/test_support/sql/parquet_partitioned')
df.createOrReplaceTempView('tmpTable')
spark.read.table('tmpTable')

还可以通过jdbc,从JDBC URL中构建DataFrame

jdbc(url, table, column=None, lowerBound=None, upperBound=None, numPartitions=None, predicates=None, properties=None)

三,DataFrameWriter类

用于把DataFrame写入到外部存储系统中,通过DataFrame.write来访问。

(df.write.format('parquet')
.mode("overwrite")
.saveAsTable('bucketed_table'))

函数注释:

  • format(source):指定底层输出的源的格式
  • mode(saveMode):当数据或表已经存在时,指定数据存储的行为,保存的模式有:append、overwrite、error和ignore。
  • saveAsTable(nameformat=Nonemode=NonepartitionBy=None**options):把DataFrame 存储为表
  • save(path=Noneformat=Nonemode=NonepartitionBy=None**options):把DataFrame存储到数据源中

对于不同的格式,DataFrameWriter类有细分的函数来加载数据:

df.write.csv(os.path.join(tempfile.mkdtemp(), 'data'))
df.write.json(os.path.join(tempfile.mkdtemp(), 'data'))
df.write.parquet(os.path.join(tempfile.mkdtemp(), 'data'))
df.write.txt(os.path.join(tempfile.mkdtemp(), 'data')) #wirte data to external database via jdbc
jdbc(url, table, mode=None, properties=None)

四,DataFrame操作

DataFrame等价于Spark SQL中的关系表,

1,常规操作

从parquet 文件中读取数据,返回一个DataFrame对象:

people = spark.read.parquet("...")

从DataFrame对象返回一列:

ageCol = people.age

从DataFrame对象中row的集合:

people.collect()

从DataFrame对象中删除列:

people.drop(*cols)

2,创建临时视图

可以创建全局临时视图,也可以创建本地临时视图,对于local view,临时视图的生命周期和SparkSession相同;对于global view,临时视图的生命周期由Spark application决定。

createOrReplaceGlobalTempView(name)
createGlobalTempView(name)
createOrReplaceTempView(name)
createTempView(name)

3,DataFrame数据的查询

df.filter(df.age > 3)
df.select('name', 'age') # join
cond = [df.name == df3.name, df.age == df3.age]
df.join(df3, cond, 'outer').select(df.name, df3.age) #group by
df.groupBy('name').agg({'age': 'mean'})

五,分组数据

DataFrame.groupBy() 返回的是GroupedData类,可以对分组数据应用聚合函数、apply函数。

df3.groupBy().max('age', 'height').collect()

请参考官方手册,不再赘述。

参考文档:

pyspark.sql module

Azure Databricks 第二篇:pyspark.sql 简介的更多相关文章

  1. Azure Databricks 第一篇:创建工作区、集群和Notebook

    Azure Databricks是一个可扩展的数据分析平台,基于Apache Spark.Azure Databricks 工作区(Workspace)是一个交互式的环境,工作区把对象(noteboo ...

  2. Python学习之路【第二篇】-pyc简介、Python常用的数据类型及其用法和常用运算符

    1.pyc简介 python程序在运行时也有编译过程,编译后会产生.pyc文件.这是一种由python虚拟机执行的二进制文件(字节码),用于保存内存中PyCodeObject,以便加快程序的加载运行. ...

  3. 数据库程序接口——JDBC——API解读第二篇——执行SQL的核心对象

    结构图 核心对象 Statement Statement主要用来执行SQL语句.它执行SQL语句的步骤为: 第一步:创建statement对象. 第二步:配置statement对象,此步骤可以忽略. ...

  4. 【ABAP系列】SAP ABAP7.40新语法简介第二篇

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP7.40新语法简 ...

  5. 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  6. (转)从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    原文地址:  http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集 ...

  7. 第二篇 SQL Server安全验证

    本篇文章是SQL Server安全系列的第二篇,详细内容请参考原文. 验证是检验主体的过程.主体需要唯一标识,那样SQL Server可以确定主体有哪些权限.正确的验证是提供安全访问数据库对象的必要的 ...

  8. 第二篇 SQL Server代理作业步骤和子系统

    本篇文章是SQL Server代理系列的第二篇,详细内容请参考原文. SQL Server代理作业由一系列的一个或多个作业步骤组成.一个作业步骤分配给一个特定的作业子系统(确定作业步骤去完成的工作). ...

  9. 【译】第二篇 SQL Server安全验证

    本篇文章是SQL Server安全系列的第二篇,详细内容请参考原文. 验证是检验主体的过程.主体需要唯一标识,那样SQL Server可以确定主体有哪些权限.正确的验证是提供安全访问数据库对象的必要的 ...

随机推荐

  1. 关于open函数文件打开模式的有意思的一个现象

    老猿前阵子学习了文件IO,最近正在回顾及进行各种验证和总结,老猿在对文件进行打开后的返回值检查属性时,发现文件打开返回的文件对象的读写模式与打开文件的模式并不完全相同,如下案例: fp1 = open ...

  2. Python正则运算符优先级re.findall('(.)*',"abc")、re.findall('(.*)',"abc")、re.findall('(.?)*',"abc")的执行结果的影响分析

    我们分别执行三个语句: >>> re.findall('(.)*',"abc") ['c', ''] >>> re.findall('(.*)' ...

  3. Github 美化设置个人主页

    起因是发现自己follow的大师傅个人主页跟普通的不太一样: 猜测应该是Github啥时候出现的新功能,查了一下,发现可以通过创建同名仓库来实现个人主页的美化设置 首先在 GitHub 上建立一个与自 ...

  4. HBase的基本使用(安装配置、启动关闭、hbash shell的基本操作、phoenix、实战)

    HBase的前提条件: JDK SSH Hadoop JDK:Hadoop和JDK运行的环境,他们的守护进程运行在JVM下.HBase支持JDK 1.6以上的版本.比如: jdk-8u161-linu ...

  5. C# Email 帮助类 EmailHelper

    1. 配置文件 App.config <?xml version="1.0" encoding="utf-8" ?> <configurati ...

  6. python学生管理名片

    name=['刘备','关羽','张飞','赵云','马超'] print('名片管理系统1.0\n1.增加一个新的名片\n2.删除一个名片\n3.修改一个名片\n4.查找一个名片\n5.退出名片管理 ...

  7. 从输入 URL 到页面展示,这中间发生了什么?

    当面试官问到,请你说说看"从输入 URL 到页面展示,这中间发生了什么?" 以前的我是这样回答的: 用户输入URL后,向服务器端发起请求.如果顺利,得到网络响应之后,浏览器对资源进 ...

  8. 总括订单Blanket order

    总括订单Blanket order是客户向其供应方发出的采购订单,但其中包含一段时间内的多个交货日期,通常使用谈判时的预定价格.大多数情况下,它用于对消耗性商品有经常性需求的情况.总括订单通常用于客户 ...

  9. REHの个人主页

    朝暮与年岁并往 然后与你一同行至天光. 简介 这是怎么做到的啊-- 把那些迷茫的浑浊的不可预知的,裁剪,变化,像个造物主一样,最终成为混沌而又分明的,除去一身的戾气和险恶,把那些复杂和晦涩都剖析成它精 ...

  10. elastic-job分布式调度与zookeeper的简单应用

    一.对分布式调度的理解 调度->定时任务,分布式调度->在分布式集群环境下定时任务这件事 Elastic-job(当当⽹开源的分布式调度框架) 1 定时任务的场景 定时任务形式:每隔⼀定时 ...