文章目录
Pyspark中的Row对象使用
Row对象介绍
在PySpark中,Row对象是DataFrame的基本组成单元,它封装了DataFrame中的每一行数据。每行数据以Row对象的形式存在,其中包含了该行的各个字段值。这些字段值可以像属性一样被访问,使得处理数据变得更加直观和方便。Row对象的创建和使用,使得PySpark能够以更加结构化的方式处理数据,提高了数据处理效率和便利性。
Row对象创建
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的基本组成单元
# 创建包含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对象
# 拉去数据到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()
转换成字典
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()
统计值出现的次数
# 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:查找的结束位置 可选
#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