:DataFrame入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了:DataFrame入门相关的知识,希望对你有一定的参考价值。


Spark是大数据体系的明星产品,是一款高性能的分布式内存迭代计算框架,可以处理海量规模的数据。下面就带大家来学习今天的内容!


一、DataFrame的组成 

DataFrame是一个二维表结构, 那么表格结构就有无法绕开的三个点:

  • 表结构描述

比如,在mysql中的一张表:

  • 由许多行组成
  • 数据也被分成多个列
  • 表也有表结构信息(列、列名、列类型、列约束等 )

基于这个前提, DataFrame的组成如下:

在结构层面:

  • - StructType对象描述整个DataFrame的表结构
  • - StructField对象描述一个列的信息

在数据层面

  • - Row对象记录一行数据
  • - Column对象记录一列数据并包含列的信息

SparkSQL-第三章:DataFrame入门_python

如图, 在表结构层面, DataFrame的表结构由:StructType描述,如下图

SparkSQL-第三章:DataFrame入门_数据_02

一个StructField记录:列名、列类型、列是否运行为空 多个StructField组成一个StructType对象。

一个StructType对象可以描述一个DataFrame:有几个列、每个列的名字和类型 、每个列是否为空

同时,一行数据描述为Row对象,如Row(1, 张三, 11)

一列数据描述为Column对象, Column对象包含一列数据和列的信息

Row、Column、StructType、StructField的编程我们在后面编码阶段会接触

二、DataFrame的代码构建

DataFrame的代码构建 - 基于RDD方式1

DataFrame对象可以从RDD转换而来, 都是分布式数据集 其实就是转换一下内部存储的结构, 转换为二维表结构。

将RDD转换为DataFrame方式1: 调用spark

SparkSQL-第三章:DataFrame入门_数据_03

通过SparkSession对象的createDataFrame方法来将RDD转换为DataFrame,这里只传入列名称,类型从RDD中进行推断, 是否允许为空默认为允许(True)。

SparkSQL-第三章:DataFrame入门_大数据_04

DataFrame的代码构建 - 基于RDD方式2

将RDD转换为DataFrame方式2:

通过StructType对象来定义DataFrame的“表结构”转换 RDD

SparkSQL-第三章:DataFrame入门_python_05

SparkSQL-第三章:DataFrame入门_大数据_06

DataFrame的代码构建 - 基于RDD方式3

将Naa转换为ae\\e」Jem?方式c:使用Naa的\\oa」方法转换Naa

SparkSQL-第三章:DataFrame入门_SQL_07

SparkSQL-第三章:DataFrame入门_数据_08

DataFrame的代码构建 - 基于Pandas的DataFrame

将denpes的ae\\e」Jem?对象,转变为分布式的SdeJ入So1 ae\\e」Jem?对象

SparkSQL-第三章:DataFrame入门_SQL_09

SparkSQL-第三章:DataFrame入门_大数据_10

DataFrame的代码构建 - 读取外部数据

通过SparkSQL的统一API进行数据读取构建DataFrame统一API示例代码:

SparkSQL-第三章:DataFrame入门_大数据_11

读取text数据源

使用format(“text”)读取文本数据

读取到的DataFrame只会有一个列, 列名默认称之为: value

示例代码:

SparkSQL-第三章:DataFrame入门_SQL_12

读取json数据源

使用format(“json”)读取json数据

示例代码:

SparkSQL-第三章:DataFrame入门_大数据_13

读取csv数据源

使用format(“csv”)读取csv数据

示例代码:

SparkSQL-第三章:DataFrame入门_pandas_14

读取deJbu?\\数据源

使用oJme\\)“deJbu?\\”(读取deJbu?\\数据

示例代码:

SparkSQL-第三章:DataFrame入门_pandas_15

deJbu?\\: 是SdeJ入中常用的一种列式存储文件格式

和Hiv?中的OND差不多, 他俩都是列存储格式

deJbu?\\对比普通的文本文件的区别:

  • deJbu?\\ 内置sDV?me )列名\\ 列类型\\ 是否为空(
  • 存储是以列作为存储格式
  • 存储是序列化存储在文件中的)有压缩属性体积小(

SparkSQL-第三章:DataFrame入门_数据_16

三、DataFrame的入门操作

DataFrame支持两种风格进行编程, 分别是:

  • DSL风格
  • SQL风格

DSL语法风格

DSL称之为:领域特定语言。

其实就是指DataFrame的特有API

DSL风格意思就是以调用API的方式来处理Data

比如: df.where().limit()

SQL语法风格

SQL风格就是使用SQL语句处理DataFrame的数据

比如: spark.sql(“SELECT * FROM xxx)

DSL - show 方法

功能:展示DataFrame中的数据, 默认展示20条

语法:

SparkSQL-第三章:DataFrame入门_大数据_17

如图,某个df.show后的展示结果

SparkSQL-第三章:DataFrame入门_数据_18

DSL - printSchema方法

功能: 打印输出df的schema信息

语法:

SparkSQL-第三章:DataFrame入门_SQL_19

SparkSQL-第三章:DataFrame入门_数据_20

DSL - select

功能:选择DataFrame中的指定列(通过传入参数进行指定)

语法:

SparkSQL-第三章:DataFrame入门_SQL_21

可传递:

• 可变参数的cols对象, cols对象可以是Column对象来指定列或者字符串

列名来指定列

• List[Column]对象或者List[str]对象, 用来选择多个列

SparkSQL-第三章:DataFrame入门_SQL_22

DSL - filter和where

功能:过滤DataFrame内的数据,返回一个过滤后的DataFrame

语法:

df.filter()

df.where()

where和filter功能上是等价的

SparkSQL-第三章:DataFrame入门_大数据_23

SparkSQL-第三章:DataFrame入门_python_24

DSL - groupBy 分组

功能:按照指定的列进行数据的分组, 返回值是GroupedData对象

语法:

df.groupBy()

SparkSQL-第三章:DataFrame入门_大数据_25

传入参数和select一样, 支持多种形式,不管怎么传意思就是告诉spark按照哪个列分组

SparkSQL-第三章:DataFrame入门_大数据_26

GroupedData对象

GroupedData对象是一个特殊的DataFrame数据集

其类全名: <class pyspark.sql.group.GroupedData>

这个对象是经过groupBy后得到的返回值, 内部记录了 以分组形式存储的数据

GroupedData对象其实也有很多API, 比如前面的count方法就是这个对象的内置方法

除此之外,像: min、 max、avg、 sum、等等许多方法都存在,后续会再次使用它

SQL风格语法 - 注册DataFrame成为表

DataFrame的一个强大之处就是我们可以将它看作是一个关系型数据表,然后可以通过在程序中

使用spark.sql() 来执行SQL语句查询,结果返回一个DataFrame。

如果想使用SQL风格的语法,需要将DataFrame注册成表,采用如下的方式:

SparkSQL-第三章:DataFrame入门_python_27

SparkSQL-第三章:DataFrame入门_大数据_28

SQL风格语法 - 使用SQL查询

SparkSQL-第三章:DataFrame入门_数据_29

pyspark.sql.functions 包

PySpark提供了一个包: pyspark.sql.functions

这个包里面提供了 一系列的计算函数供SparkSQL使用

如何用呢?

导包

from pyspark.sql import functions as F

然后就可以用F对象调用函数计算了。

这些功能函数, 返回值多数都是Column对象.

SparkSQL-第三章:DataFrame入门_数据_30

四、词频统计案例练习

我们来完成一个单词计数需求,使用DSL和SQL两种风格来实现。

在实现的过程中,会出现新的API,边写边学习新API, 代码中红色部分即新API

SparkSQL-第三章:DataFrame入门_大数据_31

五、电影评分数据分析案例

SparkSQL-第三章:DataFrame入门_pandas_32

SparkSQL-第三章:DataFrame入门_SQL_33

SparkSQL-第三章:DataFrame入门_pandas_34

六、SparkSQL Shuffle 分区数目

SparkSQL-第三章:DataFrame入门_数据_35

七、SparkSQL 数据清洗API

SparkSQL-第三章:DataFrame入门_数据_36

SparkSQL-第三章:DataFrame入门_pandas_37

SparkSQL-第三章:DataFrame入门_数据_38

SparkSQL-第三章:DataFrame入门_SQL_39

八、DataFrame数据写出

SparkSQL-第三章:DataFrame入门_数据_40

SparkSQL-第三章:DataFrame入门_数据_41

九、DataFrame 通过JDBC读写数据库(MySQL示例)

SparkSQL-第三章:DataFrame入门_数据_42

SparkSQL-第三章:DataFrame入门_数据_43

SparkSQL-第三章:DataFrame入门_python_44

以上是关于:DataFrame入门的主要内容,如果未能解决你的问题,请参考以下文章

DataFrame入门案例(集团公司对人事信息处理场景)

:DataFrame入门

Pandas入门4 -- DataFrame类及创建

在 Pyspark 中合并 DataFrame

快速入门Python DataFrame +正则表达式处理数据实例一则

入门Pandas必须掌握的技巧