码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Spark】RDD、DataFram、DataSet的比较与使用


    话题挑战赛第2期

    参赛话题:Spark实战经验分享

    目录

    简介

    1、诞生顺序

    2、三者之间的转化

    理论基础

    (一)概念

    (二)区别

    (三)共同点

    实践应用

    创建case类

    创建dataFram

    dataFram转rdd

    dataFram转dataSet 

    rdd转dataFram

    rdd转化为dataSet

    dataSet转dataFram

    dataSet转rdd

    行打印比较        


    简介

    1、诞生顺序

    RDDSpark1.0
    DataFramSpark1.3
    DataSetSpark1.6

    2、三者之间的转化

    理论基础

    (一)概念

    • RDD

            RDD是一种弹性分布式数据集,是Spark中最基本的数据抽象。RDD是只读的记录分区的集合,只能通过在其他RDD执行确定的转换操作(如map、join和group by)而创建,然而这些限制使得实现容错的开销很低。RDD的每一个分区对应就是一个Task线程。

    • DataFram

            DataFrame是一种分布式的数据集,并且以列的方式组合的。类似于关系型数据库中的表。可以说是一个具有良好优化技术的关系表。DataFrame背后的思想是允许处理大量结构化数据。提供了一些抽象的操作,如select、filter、aggregation、plot。DataFrame包含带schema的行。schema是数据结构的说明。相当于具有schema的RDD。

    • DataSet

            DataSet是可以并行使用函数或关系操作转化特定域对象的强类型集合。每个DataSet有一个非类型化的DataFram。DataFram是DataSet[Row]的别名。

    (二)区别

    • DataFram与RDD的主要区别在于,前者带有Schema元信息,即DataFram表示的二维表数据集的每一列都带有名称和类型。这使得Spark SQL 得以解析到具体数据的结构信息,从而对DataFram中的数据源以及对DataFram的操作进行了非常有效的优化,从而大幅提升了运行效率。RDD一般和Spark MLlib同时使用。
    • 与DataFram不同的是,DataSet是强类型的,而DataFram实际上就是DataSet[Row](也就是java中的DataSet)。

    (三)共同点

            三者都是弹性分布式数据集,都有分区的概念和惰性机制,在进行创建、转换操作时不会立即执行,只有在遇到执行算子时,才会开始执行计算。 

    实践应用

    • 创建case类

    case class User(name: String, age: Int, address: String)
    • 创建dataFram

    1. val spark = SparkSession.builder().master("local[*]")
    2. .appName("test").getOrCreate()
    3. import spark.implicits._
    4. val sc = spark.sparkContext
    5. sc.setLogLevel("WARN")
    6. /**
    7. * 创建DataFram
    8. */
    9. val user_df: DataFrame = Seq(
    10. User("zhangsan", 20, "河南"),
    11. User("lisi", 16, "北京"),
    12. User("wangwu", 21, "上海")
    13. ).toDF()
    • dataFram转rdd

    val user_rdd: RDD[Row] = user_df.rdd
    • dataFram转dataSet 

    val user_dataset: Dataset[User] = user_df.as[User]
    • rdd转dataFram

    1. val rddTodf: DataFrame = user_rdd.map(row => {
    2. (row.getAs[String](0), row.getAs[Int](1), row.getAs[String](2))
    3. }).toDF("name1", "age1", "address1")
    • rdd转化为dataSet

    1. val rddToDs: Dataset[User] = user_rdd.map(row => {
    2. User(row.getAs[String](0), row.getAs[Int](1), row.getAs[String](2))
    3. }).toDS()
    • dataSet转dataFram

    val dsToDf: DataFrame = user_dataset.toDF()
    • dataSet转rdd

    val rdd: RDD[User] = user_dataset.rdd
    • 行打印比较        

    1.  user_df.foreach(t => println(t))
    2. [zhangsan,20,河南]
    3. [wangwu,21,上海]
    4. [lisi,16,北京]
    5. user_rdd.foreach(t => println(t))
    6. [lisi,16,北京]
    7. [zhangsan,20,河南]
    8. [wangwu,21,上海]
    9. user_dataset.foreach(t => println(t))
    10. User(zhangsan,20,河南)
    11. User(wangwu,21,上海)
    12. User(lisi,16,北京)
  • 相关阅读:
    技术干货:解密最受欢迎的开源 Serverless 框架弹性技术实现
    在 Android 中使用 Lambda 的原理
    马化腾去年年薪同比下降 25%,腾讯的下一步怎么走?
    el-date-picker 封装一个简单的日期组件, 主要是禁用日期
    DevSecOps 安全即代码基础指南
    scipy在控制理论的应用
    基础复习——图像视图ImageView——图像按钮ImageButton——同时展示文本与图像...
    Ragnar-lothbrok 靶机
    java技术专家面试指南80问【java学习+面试宝典】(六)
    「南凌科技SASE DAY」助力企业数字化转型的挑战和应对实践
  • 原文地址:https://blog.csdn.net/hyj_king/article/details/126946434
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号