Pyspark中的ROW对象使用

文章目录

Pyspark中的Row对象使用

Row对象介绍

在PySpark中,Row对象是DataFrame的基本组成单元,它封装了DataFrame中的每一行数据。每行数据以Row对象的形式存在,其中包含了该行的各个字段值。这些字段值可以像属性一样被访问,使得处理数据变得更加直观和方便。Row对象的创建和使用,使得PySpark能够以更加结构化的方式处理数据,提高了数据处理效率和便利性。

Row对象创建

python 复制代码
from pyspark import SparkSession,Row
from pyspark import SparkContext,SparkConf

conf = SparkConf()
conf.setAppName('ldsx_create_rdd')
conf.setMaster('local[*]')

# 初始化对象
spark = SparkSession.builder.config(conf=conf).getOrCreate()

#创建Row对象
fields = ["name", "age", "height"]
schema = Row(*fields)
data1 = schema('ldsx',18,183)
#print内容
Row(name='ldsx', age=18, height=183)

#可以直接通过属性访问
data1.name
# 可以通过索引访问
data1[0]

使用Row对象创建DataFrame

Row对象是DataFrame的基本组成单元

python 复制代码
# 创建包含row对象的列表
row_list = [schema(1,2,3),schema(2,3,4),schema('ldsx',3,4)]
# 打印信息
>>[Row(name=1, age=2, height=3), Row(name=2, age=3, height=4), Row(name='ldsx', age=3, height=4)]
# 使用row对象创建dataframe
df_1 = spark.createDataFrame(row_list)
df_1.show()
'''
+----+---+------+
|name|age|height|
+----+---+------+
|   1|  2|     3|
|   2|  3|     4|
|ldsx|  3|     4|
+----+---+------+
'''

DataFrame转换为row对象

python 复制代码
# 拉去数据到dirver端,在生产中慎用collect
df_1.rdd.collect()
>>[Row(name='Alice', age=25, score=None), Row(name='Bob', age=None, score=30), Row(name='John', age=35, score=40)]
# 可以在map中进行处理 lambda 可以换成专门处理方法,这个传入lambda的x就是row对象
df.rdd.map(lambda x:print(x)).count() #count作用触发map

Row对象包含的方法

asDict()

转换成字典

python 复制代码
from pyspark import SparkSession,Row
from pyspark import SparkContext,SparkConf
#创建Row对象
data2 = Row(name='ldsx2', age=18, height=183)

#row对象转换dict结构
data1.asDict()
#输出内容
>>{'name': 'ldsx2', 'age': 18, 'height': 183}

#row对象中包含row对象 使用True参数内部也会转换
Row(ldsx=1, val=Row(name='a', age=2)).asDict()
>>{'ldsx': 1, 'val': Row(name='a', age=2)}
Row(ldsx=1, val=Row(name='a', age=2)).asDict(True) #True内部也转换
>>{'ldsx': 1, 'val': {'name': 'a', 'age': 2}}

count()

统计值出现的次数

python 复制代码
# count只能统计外层值 这种值为Row对象的里面如果值存在1 也不会统计
Row(ldsx=1, val=Row(name='a', age=1),ldsx3=1).count(1) 
#返回值为1的个数
>>2

index()

index(value[, start, stop])

类似python list中index方法

value:要查询的值

start :查找的起始位置 可选

stop:查找的结束位置 可选

python 复制代码
#row对象里面值row对象不查询
Row(ldsx=1, val=Row(ldsx=1, age=1),ldsx3=1,ldsx4=1).index(1,1,5)
#返回搜索索引范围1~5中值为1的索引编号
>>2

# 查找不存在的元素报错,通过报错也可知index方法是吧row对象当成了一个tuple进行查询的
'''
Row(ldsx=1, val=Row(ldsx=1, age=1),ldsx3=1,ldsx4=1).index(9,1,5)
Traceback (most recent call last):
  File "/home/ldsx/down_load/pycharm_data/pycharm-community-2024.2/plugins/python-ce/helpers/pydev/_pydevd_bundle/pydevd_exec2.py", line 3, in Exec
    exec(exp, global_vars, local_vars)
  File "<input>", line 1, in <module>
ValueError: tuple.index(x): x not in tuple
'''
#所以我们肯定也可以使用索引位置进行row对象内的元素访问如
data1 = Row(ldsx=1, val=Row(ldsx=1, age=1),ldsx3=1,ldsx4=1)
data1[0]
#返回
>>1
相关推荐
重生之我是数学王子几秒前
QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现
开发语言·c++·qt
Ai 编码助手2 分钟前
使用php和Xunsearch提升音乐网站的歌曲搜索效果
开发语言·php
学习前端的小z6 分钟前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
神仙别闹14 分钟前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#
XINGTECODE15 分钟前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
zwjapple31 分钟前
typescript里面正则的使用
开发语言·javascript·正则表达式
小五Five33 分钟前
TypeScript项目中Axios的封装
开发语言·前端·javascript
前端每日三省34 分钟前
面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?
开发语言·前端·javascript
好看资源平台44 分钟前
网络爬虫——综合实战项目:多平台房源信息采集与分析系统
爬虫·python
凡人的AI工具箱1 小时前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang