将RDD转换为Dataframe几种方法

将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
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值