将RDD转换为Dataframe几种方法
方式一:反射推断
如果RDD中每个元素的类型是Row类型,就可以自动转换为DataFrame
1.拆出数据中需要的列,看用什么分隔符分割,存入列表中,准备好列名
2.对数据进行过滤清洗
3.取对应位置的数据作为一列, 用Row(userid=item[0],…)构建出row类型对象
movie_rdd_row = ( movie_rdd_str
# 先分割,将每条数据从字符串转换成列表
.map(lambda line: re.split("\\s+", line))
# 再过滤,保留元素个数为4
.filter(lambda item: len(item) == 4)
# 将每个列表转换成每个Row类型
.map(lambda item: Row(userid=item[0], movieid=item[1], rate=float(item[2]), ts=int(item[3])))
)
方式二:自定义Schema
如果一个RDD中的元素类型为列表或者元组,可以根据RDD中的元素自定义一个Schema,然后合并构建一个DataFrame
要求1:RDD中元素类型必须为列表或者元组
要求2:基于RDD中的数据自定义一个Schema:表的结构信息
表的结构信息就是一个列表,这个列表中一条信息代表一列的信息:列名、列的类型、列是否允许为空
StructType:代表一个Schema
StructField:代表一列的信息
# 构建要求2:自定义一个Schema
user_schema = StructType([
StructField(name="userid", dataType=StringType(), nullable=True),
StructField(name="movieid", dataType=StringType(), nullable=True),
StructField(name="rate", dataType=DoubleType(), nullable=True),
StructField(name="ts", dataType=IntegerType(), nullable=True)
])
# 构建DataFrame
df2 = spark.createDataFrame(movie_rdd_tuple, user_schema)
方式三:调用toDF函数:
允许用户将列表或者元组类型的RDD调用toDF函数,直接指定每一列的列名来自动转换为DF
from pyspark.sql.types import Row, StructType, StructField, StringType, DoubleType, IntegerType
"""工作中:要实现转换,不用使用方式一或者方式二,直接调用一个API:rdd.toDF"""
df3 = movie_rdd_tuple.toDF(["userid", "movieid", "rate", "ts"])
DSL开发常用API
- count:统计行数
- collect:将DataFrame转换成一个数组
- take:取DataFrame中前N行的数据
- first:取DataFrame中第一行的数据
- head:默认取DataFrame中第一行的数据,可以指定返回前N行的数据
- tail:可以指定返回后N行的数据
- foreach:对DataFrame中每条数据进行处理,没有返回值
- foreachPartition:对DataFrame中每个分区数据进行处理,没有返回值
- distinct:对DataFrame中每条数据进行去重处理
- union/unionAll:实现两个DataFrame的合并
- coalesce/repartition:调整DataFrame的分区数
- cache/persist:对DataFrame进行缓存
- unpersist:取消DataFrame的缓存
- columns:返回DataFrame中的所有列名
- schema:返回DataFrame中Schema的信息
- rdd:返回DataFrame中的数据放入RDD中
- printSchema:打印DataFrame的Schema信息
DSL中的SQL函数
import pyspark.sql.functions as F
# 1、选择函数select:选取某些列或者某些函数表达式的值
def select(self, *cols: Union[Column, str]) -> DataFrame
# 2、过滤函数filter/where:设置过滤条件,类似SQL中WHERE语句
def where(self, condition: Union[Column, str]) -> DataFrame
# 3、分组函数groupBy/rollup/cube:对某些字段分组,在进行聚合统计
def groupBy(self, *cols: Union[Column, str]) -> GroupedData
# 4、聚合函数agg:通常与分组函数连用,使用一些count、max、sum等聚合函数操作
def agg(self, *exprs: Union[Column, Dict[str, str]]) -> DataFrame
# 5、排序函数sort/orderBy:按照某写列的值进行排序(升序ASC或者降序DESC)
def orderBy(self,
*cols: Union[str, Column, List[Union[str, Column]]],
ascending: Union[bool, List[bool]] = ...) -> DataFrame
# 6、限制函数limit:获取前几条数据,类似RDD中take函数
def limit(self, num: int) -> DataFrame
# 7、重命名函数withColumnRenamed:将某列的名称重新命名
def withColumnRenamed(self, existing: str, new: str) -> DataFrame
# 8、删除函数drop:删除某些列
def drop(self, cols: Union[Column, str]) -> DataFrame
# 9、增加列函数withColumn:当某列存在时替换值,不存在时添加此列
def withColumn(self, colName: str, col: Column) -> DataFrame