当前位置:网站首页>spark中RDD与DF的关系
spark中RDD与DF的关系
2022-08-02 14:05:00 【boyzwz】
1、spark中的模块
Spark中的模块显示了Spark的模块及各模块之间的关系。底层是Spark-core核心模块,Spark每个模块都有一个核心抽象,Spark-core的核心抽象是RDD,Spark SQL等都基于RDD封装了自己的抽象,在Spark SQL中是DataFrame/DataSet对象。相对来说RDD是更偏底层的抽象,DataFrame/DataSet是在其上做了一层封装,做了优化,使用起来更加方便。从功能上来说,DataFrame/DataSet能做的事情RDD都能做,RDD能做的事情DataFrame/DataSet不一定能做。
2、DataFrame
与RDD类似,DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表格,除了数据以外,还记录数据的结构信息,即schema。同时,与Hive类似,DataFrame也支持嵌套数据类型(struct、array和map)。从API易用性的角度上看,DataFrame API提供的是一套高层的关系操作,比函数式的RDD API要更加友好,门槛更低。由于与R和Pandas的DataFrame类似,Spark DataFrame很好地继承了传统单机数据分析的开发体验。
3、RDD与DF的区别
DataFrame与RDD的主要区别在于DataFrame带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。使得Spark SQL得以洞察更多的结构信息,从而对藏于DataFrame背后的数据源以及作用于DataFrame之上的变换进行了针对性的性能优化,最终达到大幅提升运行时效率的目标。
RDD,由于无从得知所存数据元素的具体内部结构,Spark Core只能在stage层面进行简单、通用的流水线优化。DataFrame底层是以RDD为基础的分布式数据集,和RDD的主要区别的是:RDD中没有schema信息,而DataFrame中数据每一行(Row)都包含schema
DataFrame = RDD[Row] + shcema
4、RDD与DF的转换
package com.shujia.spark.sql
import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Row, SparkSession}
object Demo3DFAndRDD {
def main(args: Array[String]): Unit = {
/**
* spark sql 的入口
*/
val spark: SparkSession = SparkSession
.builder()
.master("local")
.appName("spark")
.getOrCreate()
//通过spark获取spark上下文对象,写代码入口
val sc: SparkContext = spark.sparkContext
val linesRDD: RDD[String] = sc.textFile("data/students.txt")
val stuRDD: RDD[(String, String)] = linesRDD.map(lines => {
val strings: Array[String] = lines.split(",")
(strings(0), strings(1))
})
//导入隐式转换
import spark.implicits._
//RDD 2 DF
val stuDF: DataFrame = stuRDD.toDF("id", "name")
stuDF.show()
//DF 2 RDD
val rowRDD: RDD[Row] = stuDF.rdd
val reRDD: RDD[(String, String)] = rowRDD.map(row => {
//根据列名获取数据
val id: String = row.getAs("id")
val name: String = row.getAs("name")
(id, name)
})
reRDD.foreach(println)
}
}
边栏推荐
猜你喜欢
What's wrong with running yolov5 (1) p, r, map are all 0
C语言日记 6 基本输入/输出
MySQL知识总结 (四) 事务
Implementation of redis distributed lock and watchdog
MySQL知识总结 (八) InnoDB的MVCC实现机制
C语言初级—水仙花数
Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin [id ‘c
无人驾驶综述:等级划分
C语言sizeof和strlen的区别
Unit 14 Viewsets and Routing
随机推荐
浏览器报错数字代表的大概意思
window10 lower semi-automatic labeling
Flask-RESTful request response and SQLAlchemy foundation
drf source code analysis and global catch exception
PHP版本切换:5.x到7.3
原码、反码、补码和移码
[ROS] (02) Create & compile ROS package Package
主存储器(一)
Visual Studio配置OpenCV之后,提示:#include<opencv2/opencv.hpp>无法打开源文件
Flask framework
初识c语言指针
Introduction and use of Haystack
C语言一维数组练习——将一个字符串中的某个字符替换成其它字符
华为防火墙
二级指针,数组指针,指针数组和函数指针
【c】小游戏---扫雷雏形
Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin [id ‘c
YOLOv7使用云GPU训练自己的数据集
MySQL知识总结 (十) 一条 SQL 的执行过程详解
ABP,kendo后台接口,新增,查询