如何理解spark中RDD和DataFrame的结构

如何理解spark中RDD和DataFrame的结构,第1张

spark中RDD和DataFrame的结构:

RDD就是一个分布式的无序的列表。

RDD中可以存储任何的单机类型的数据,但是,直接使用RDD在字段需求明显时,存在算子难以复用的缺点。

例如,现在RDD存的数据是一个Person类型的数据,现在要求所有每个年龄段(10年一个年龄段)的人中最高的身高与最大的体重。

使用RDD接口,因为RDD不了解其中存储的数据的具体结构,数据的结构对它而言是黑盒,于是这就需要用户自己去写一个很特化的聚合的函数来完成这样的功能。

而有了DataFrame,则框架会去了解RDD中的数据是什么样的结构的,用户可以说清楚自己对每一列进行什么样的 *** 作,这样就有可能可以实现一个算子,用在多个列上,比较容易进行算子的复用。甚至,未来又要同时求出每个年龄段内不同的姓氏有多少个,则使用RDD接口,之前的函数需要改动很大才能满足需求,而使用DataFrame接口,则只需要添加对这一个列的处理,原来的max/min的相关列处理都可保持不变。

总而言之,DataFrame相关接口就是RDD的一个扩展,让RDD了解了RDD中存储的数据包含哪些列,并可以在列上进行 *** 作。

另外,DataFrame基本上快要被Dataset接口取代了,你可以再去了解下Dataset接口。

创建 SQLContext

Spark SQL 中所有相关功能的入口点是 SQLContext 类或者它的子类, 创建一个 SQLContext 的所有需要仅仅是一个 SparkContext。

使用 Scala 创建方式如下:

val sc: SparkContext // An existing SparkContext.

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

// this is used to implicitly convert an RDD to a DataFrame.

import sqlContext.implicits._

使用 Java 创建方式如下:

JavaSparkContext sc = ...// An existing JavaSparkContext.

SQLContext sqlContext = new org.apache.spark.sql.SQLContext(sc)

使用 Python 创建方式如下:

from pyspark.sql import SQLContext

sqlContext = SQLContext(sc)

除了一个基本的 SQLContext,你也能够创建一个 HiveContext,它支持基本 SQLContext 所支持功能的一个超集。它的额外的功能包括用更完整的 HiveQL 分析器写查询去访问 HiveUDFs 的能力、 从 Hive 表读取数据的能力。用 HiveContext 你不需要一个已经存在的 Hive 开启,SQLContext 可用的数据源对 HiveContext 也可用。HiveContext 分开打包是为了避免在 Spark 构建时包含了所有 的 Hive 依赖。如果对你的应用程序来说,这些依赖不存在问题,Spark 1.3 推荐使用 HiveContext。以后的稳定版本将专注于为 SQLContext 提供与 HiveContext 等价的功能。

用来解析查询语句的特定 SQL 变种语言可以通过 spark.sql.dialect 选项来选择。这个参数可以通过两种方式改变,一种方式是通过 setConf 方法设定,另一种方式是在 SQL 命令中通过 SET key=value 来设定。对于 SQLContext,唯一可用的方言是 “sql”,它是 Spark SQL 提供的一个简单的 SQL 解析器。在 HiveContext 中,虽然也支持”sql”,但默认的方言是 “hiveql”,这是因为 HiveQL 解析器更完整。

本文主要介绍Pandas中DataFrame的常用方法。在正式介绍之前,需要先说明以下几点:

从DataFrame中抽取出其中的一列形成的数据类型既可以是Series,也可以是DataFrame,具体如下图。这两种数据类型支持的方法大部分相似。但本篇主要介绍DataFrame类型支持的 *** 作。

在这里插入图片描述

DataFrame中的很多方法都包含参数axis,这个参数可以控制方法的 *** 作方向:按行or按列(axis=0,默认值)。正文的示例中不再特意针对这个参数来对比方法效果。

DataFrame中的方法有很多。大部分方法从方法名称就可以推断出方法的作用,这类方法就不再详细介绍了。

DataFrame中的一些方法有别名,比如notnull和notna,这里只会介绍其中一个。

DataFrame中的一些方法已经在其他博客中介绍过,这里也不会再继续介绍。具体链接放在相关内容部分。

1 常用计算

  这里的一般计算主要包括以下几类。如下:

加减乘除等计算:add(加+)、sub(减-)、mul(乘*)、div\truediv(除/)\floordiv(地板除//)、mod(求余%)、pow(幂计算)、rsub、rfloordiv\rtruediv\rdiv、rpow、radd、rmod、rmul。不以r开头的方法也可以直接使用对应的算术运算符来计算;

累计求值计算:cumsum、cummin、cummax、cumpod

逻辑运算:eq(等于==)、ne(不等于!=)、le(小于等于<=)、lt(小于;<)、ge(大于等于>=)、gt(大于>)、all(若全为True则为True,否则为False)、any(若有一个为True即为True)

统计函数:count、sum、max、min、mean、median、mode、std、var、prod(所有值的乘积)

其他计算:corr(相关性)、skew(偏度)、kurt(峰度);

举例如下:

import pandas as pd

import numpy as np

data=pd.DataFrame([[11,13],[0,20],[24,45]],columns=list('AB'))

data_1=data.cumprod()

data_2=data.ge(pd.Series({'A':10,'B':15})) #判断条件:第一列是否大于等于10,第二列是否大于等于15

data_3=data_2.all(axis=1) #如果某一行全为True,则返回True,否则返回False

data_4=data.count()

data_5=data.corr() #计算两列的相关性

1

2

3

4

5

6

7

8

1

2

3

4

5

6

7

8

其结果如下:

在这里插入图片描述

2 遍历数据

  DataFrame中与数据遍历相关的方法主要包括:items、iteritems(与items作用相同,未来版本会删除)、iterrows、itertuples(目前没看出来有什么特殊之处)。这几个方法的主要区别如下:

除了itertuples()返回的数据类型为map之外,其余方法返回的数据类型均为迭代器。

items和iterrows返回的迭代器中的每个元素均为tuple。

items按列返回数据,iterrow按行返回数据。

具体用法举例如下(运算结果不展示):

data=pd.DataFrame([['A',1],['B',2]],columns=['col_1','col_2'])

for item in data.items():

print(item)

for row in data.iterrows():

print(row)

1

2

3

4

5

1

2

3

4

5

3 排序相关

3.1 rank方法

  DataFrame中提供了排序方法rank(),该方法返回值对应的排序名次。其主要参数如下:

参数 作用

axis 指定排序方向

method 指定一组记录的排序方法:‘average’, ‘min’, ‘max’, ‘first’, ‘dense’

numeric_only 是否只对数值型列进行排序

na_option 指定空值处理方式:‘keep’, ‘top’, ‘bottom’

ascending 是否升序

pct 是否以百分比的形式展示排名

其用法举例如下:

import pandas as pd

data=pd.DataFrame([['A',10],['B',29],['a',19],[None,34],['A',17]],

columns=['col_1','col_2'])

data_1=data.rank(method='max')

data_2=data.rank(numeric_only=True,pct=True)

1

2

3

4

5

1

2

3

4

5

其结果如下:

在这里插入图片描述

下面依次对其就结果进行说明:

先来看data_1中的col_2,将data中col_2列的结果从小到大排序,那么10排在第1位,17排在第2位,19排在第三位,依次类推。所以data_1中col_2列的值依次为:1、4、3、5、2;

再来看data_1中的col_1,首先空值不会参与排序;其次字母是按照其对应的ascii码值进行排序的,所以A<B<a另外,A出现两次,所以这里A最终的输出结果要使用method指定的方法来计算。在排序之后的数据中,A占据第1位和第2位,所以在method为max方法的前提下,A返回的结果为2。

再来看data_2。因为这里设置了numeric_only,所以col_1列并不进行排序,其次,pct为True,所以col_2列返回的是其排序对应的百分比。其百分比的计算公式为:排序值/max(排序值)。

3.2 idxmax/idxmin方法

  idxmax()/idxmin()方法可以返回最大值、最小值对应的索引。具体用法举例如下:

import pandas as pd

data=pd.DataFrame([['A',10,False],['B',29,False],['a',19,True],[None,34,True],['A',17,True]],

columns=['col_1','col_2','col_3'],

index=['A0','A1','A2','A3','A4'])

data_1=data[['col_2','col_3']].idxmax()

data_2=data[['col_2','col_3']].idxmin()

1

2

3

4

5

6

1

2

3

4

5

6

其结果如下:

在这里插入图片描述

这里有以下几点需要说明:

idxmax()\idxmin()方法支持的数据类型有:int,float和boolean。所以若针示例中的data直接运行data.idxmax()或data.idxmin()的话,会报错:TypeError: reduction operation ‘argmax’ not allowed for this dtype。

对于boolean类型数据,True>False

若最大值有多个,则返回最大值第一次出现时对应的索引值。

3.3 nlargest/nsmallest方法

  nlargest()/nsmallest()方法可以返回最大最小的k kk个值。主要包括以下三个参数:

参数 作用

n 返回的项数

columns 指定排序的一个或多个列名

keep 如何处理重复值。可选值:last、first、all

其用法举例如下:

import pandas as pd

data=pd.DataFrame([['A',10,False],['A',10,False],['a',19,True],[None,17,True],['A',17,True]],

columns=['col_1','col_2','col_3'],

index=['A0','A1','A2','A3','A4'])

data_1=data.nsmallest(n=3,columns=['col_2'],keep='all')

data_2=data.nlargest(n=4,columns=['col_3'],keep='first')

1

2

3

4

5

6

1

2

3

4

5

6

其结果如下:

在这里插入图片描述

这里有以下几点需要说明:

columns参数指定的排序列可以是数值型及布尔型,但不能接收字符串类型。

keep在什么时候才会发挥作用?从data_1的结果可以发现,当按照col_2列的值选取最小的3个项时,第3项对应的col_2值为17,而data中col_2值为17的项有两个(索引为A3和A4),keep参数可以控制是A3还是A4返回给data_1。当keep=‘first’时,A3返回给data_1,当keep='last’时,A4返回给data_1,当keep='all’时,所有都返回给data_1。

4 其他

1. add_prefix()\add_suffix()方法

  这两个方法可以给DataFrame的列名添加统一的前后缀。具体用法如下:

import pandas as pd

dt=pd.DataFrame([['A',1],['B',1]],columns=['A','B'])

dt1=dt.add_prefix('Col_') #给列名增加统一的前缀

dt2=dt.add_suffix('_Col') #给列名添加统一的后缀

1

2

3

4

1

2

3

4

dt、dt1、dt2的结果分别如下:

在这里插入图片描述

2. align()数据对齐

  Pandas执行运算时,会先按照索引进行对齐,对齐以后再进行相应的运算,没有对齐的位置一般会用NaN进行补齐。Pandas提供了专门的方法align()对两个DataFrame进行数据对齐。该方法中的主要参数如下:

参数 作用

other 可以是DataFrame或者Series。

join 对齐方式:‘outer’(默认值), ‘inner’, ‘left’, ‘right’

axis 对齐方向:取值为0时按索引对齐,取值为1时按列进行对齐,不设置该值时行和列同时对齐

level

fill_value 填充值,默认为np.nan

method 值的填充方式

limit 向前向后填充NaN值的数量

fill_axis

broadcast_axis

用法举例如下:

import pandas as pd

dt1=pd.DataFrame(np.arange(8).reshape(4,2),columns=['A','B'],index=[1,2,3,4])

dt2=pd.DataFrame(np.arange(12).reshape(4,3),columns=['A','B','C'],index=[1,2,'a','b'])

left,right=dt1.align(dt2,join='inner')

left_1,right_1=dt1.align(dt2,join='outer',fill_value=100)

left_2,right_2=dt1.align(dt2,join='outer',method='backfill',limit=1)

1

2

3

4

5

6

1

2

3

4

5

6

dt1和dt2的结果如下:

在这里插入图片描述

left、right的结果如下:当join为inner时,会在两个方向上同时求交集(因为没有指定axis)。

在这里插入图片描述

left_1、right_1的结果如下:使用100填充没有对齐的位置。

在这里插入图片描述

left_2、right_2的结果如下:

在这里插入图片描述

3. asfreq()

  asfreq()方法可以把时间序列型的索引(即DatetimeIndex型、PeriodIndex型)转化到特定的时间频率。具体用法举例如下:

import pandas as pd

idx1=pd.date_range(start='2022-07-25',end='2022-07-26',freq='D')

idx2=pd.period_range(start='2022-07-25',end='2022-07-26',freq='D')

dt1=pd.DataFrame([[1,2],[3,4]],columns=['A','B'],index=idx1)

dt2=pd.DataFrame([[1,2],[3,4]],columns=['A','B'],index=idx2)

1

2

3

4

5

1

2

3

4

5

dt1和dt2的结果如下:

在这里插入图片描述

当对这两个DataFrame变量进行asfreq *** 作后得到的结果如下:

当DataFrame的索引为DatetimeIndex类型时,新的索引是利用pd.date_range()方法利用asfreq()方法中的指定的freq重新生成的,新出现的索引对应的值会用空值进行填充。

在这里插入图片描述

当DataFrame的索引为PeriodIndex类型时,新索引和旧索引是一对一的关系。

在这里插入图片描述

4. asof()

  asof()方法返回指定索引(包含该索引)之前最后一行在指定列不含空值的数据。 具体用法如下:

在这里插入图片描述

使用asof()方法要注意以下几点:

DataFrame或Series必须是已经排序的。

未指定subset是会对DataFrame的所有列进行非空判断。

5. assign()

  给DataFrame分配新列。具体如下:

在这里插入图片描述

这里要注意assign()中匿名函数中的x为dt本身,所以这里要注意匿名函数的写法。

相关内容

loc/iloc方法:https://blog.csdn.net/yeshang_lady/article/details/89103572

cut/qcut方法:https://blog.csdn.net/yeshang_lady/article/details/107957020

apply/applymap方法:https://blog.csdn.net/yeshang_lady/article/details/103324742

isin方法:https://blog.csdn.net/yeshang_lady/article/details/112207877

pivot_table方法:https://blog.csdn.net/yeshang_lady/article/details/103068031

groupby方法:https://blog.csdn.net/yeshang_lady/article/details/102488971

unique/nunique方法:https://blog.csdn.net/yeshang_lady/article/details/105345653

join/merge方法:https://blog.csdn.net/yeshang_lady/article/details/103363486

at_time/between_time方法:https://blog.csdn.net/yeshang_lady/article/details/121953450

文章已被收录至官方知识档案

Python入门技能树结构化数据分析工具PandasPandas概览

200379 人正在系统学习中

点击阅读全文

打开CSDN,阅读体验更佳

Python Pandas中dataframe常用 *** 作(创建、读取写入、切片等)_Parzival...

对索引顺序有要求的用Series添加。 注意:若使用Series初始化一定要指定index,因为它默认索引为0、1、2…,如果你的dataframe索引不是,就会全部初始化为NaN。 >>>df3['price']=pd.Series([1,2,3])>>>df3 name color num price ...

...DataFrame基本 *** 作_GoAI的博客_python dataframe *** 作

Dataframe *** 作总结参考:https://www.cnblogs.com/bethansy/p/8323763.html 一、查看数据(查看对象的方法对于Series来说同样适用) 1.查看DataFrame前xx行或后xx行 a=DataFrame(data)a.head(6)表示显示前6行数据,若head()中不带...

Dataframe的多种创建方法

Dataframe的多种创建方法 "二维数组"Dataframe:是一个表格型的数据结构,包含一组有序的列,其列的值类型可以是数值、字符串、布尔值等。 Dataframe中的数据以一个或多个二维块存放,不是列表、字典或一维数组结构 # Dataframe是一个表格型数据结构,“带有标签的二维数组” # Dataframe带有index(行标签)和columns(列标签) import panda...

继续访问

DataFrame常用方法详解

本文详细讲解了dataframe中常用的方法head()、tail()、info()、describe()、value_counts()、drop()、rename()、copy()、reset_index()

继续访问

python中dataframe的使用_归去来?的博客

python中dataframe的使用 Python之DataFrame常用方法小结 【Series】 性质:一维数组对象,类似NumPy 的一维array。 除了包含一组数据还包含一组索引,所以可以把它理解为一组带索引的数组。 obj = Series([1,2,3,4],index = [‘a’,...

Python dataframe.pivot()用法解析_WALL-EC的博客_dataframe...

python pandas 库的dataframe pivot()函数用法解析:简而言之,我理解的pivot()的用途就是,将一个dataframe的记录数据整合成表格(类似Excel中的数据透视表功能),而且是按照pivot(‘index=xx’,’columns=xx’,’values=xx’)来整合的。...

最新发布 python大数据之dataframe常用 *** 作

详细讲解了dataframe的常用 *** 作,包含创建,增删改查,算数运算,逻辑运算,常用聚合函数以及lamda函数的使用等

继续访问

Python Pandas中dataframe常用 *** 作(创建、读取写入、切片等)

Series &Dataframe 一个感觉描述得比较好的示意图: 在一些涉及到批量处理二维列表中数据的场景中,使用dataframe会简便很多。 而只有一维数据的dataframe就是series啦。 感觉dataframe用的多一些,就先记录dataframe吧。 import pandas as pd Dataframe 1. 创建Dataframe 空dataframe # 创建空dataframe >>>df = pd.DataFrame() >>&

继续访问

python大数据之dataframe常用 *** 作_addict_jun的博客_python *** 作...

dataframe与dataframe之间 + , - , * , / 可以在两个dataframe之间进行运算,属于一对一的计算。 4.逻辑运算 逻辑运算符号<, >, |, &逻辑运算类型:>, >=, <, <= , ==, != ...

Python之DataFrame基础知识点_酒酿小圆子~的博客_python中d...

Python之DataFrame基础知识点 华为云开发者联盟该内容已被华为云开发者联盟社区收录,社区免费抽大奖

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11767035.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存