【大数据学习 | Spark-SQL】关于RDD、DataFrame、Dataset对象

1. 概念:

RDD:

弹性分布式数据集;

DataFrame:

DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。这样的数据集可以用SQL查询。DataFrame是不可变的,即一旦创建,就不能修改其内容。

DataFrame 是 DataSetRow

DataSet:

简单的说,DataSet和DataFrame的区别就是,DataSet会在编译阶段就进行类型检查 ,而DataFrame在运行阶段才会类型检查。

Dataset是一个强类型 的特定领域的对象,Dataset也被称为DataFrame的类型化视图,**这种DataFrame是Row类型的Dataset,即DatasetRow。**Dataset结合了DataFrame的优化和RDD的类型安全。Dataset提供了编译时类型检查(而DataFrame不会,DataFrame只会在运行阶段才会检查类型),确保数据在编译阶段就符合预期的类型。

dataset是dataFrame的升级版对象,dataframe是一个传统的sql编程对象,如果要想使用dataframe进行灵活开发的比较复杂。

dataset和dataFrame是一个类别的对象,都是可以进行sql查询数据的,并且可以支持rdd上面的方法。

当我们需要对一个表对象进行二次处理的话建议大家转换为dataset而不是dataframe。

Scala 复制代码
package com.hainiu.spark

import org.apache.spark.sql.{Dataset, SparkSession}

object TestDSAndDF {
  def main(args: Array[String]): Unit = {
    val session = SparkSession.builder().master("local[*]").appName("test").getOrCreate()
    import session.implicits._
    val ds: Dataset[String] = session.read.textFile("file:///headless/workspace/spark/data/a.txt")
    ds.map(t=>{
      val strs = t.split(" ")
      (strs(0), strs(1), strs(2), strs(3))
    })

//    val df = session.read.format("org.apache.spark.sql.execution.datasources.v2.text.TextDataSourceV2")
//      .load("file:///headless/workspace/spark/data/a.txt")
//    
//    val ds: Dataset[(String, String, String, String)] = df.map(row => {
//      val line = row.getAs[String]("value")
//      val strs = line.split(" ")
//      (strs(0), strs(1), strs(2), strs(3))
//    })
  }
}

2. 三者之间的转换

Scala 复制代码
  val ds: Dataset[String] = session.read.textFile("file:///headless/workspace/spark/data/a.txt")
    ds.map(t=>{
      val strs = t.split(" ")
      (strs(0), strs(1), strs(2), strs(3))
    })

    val df1 = ds.toDF("id","name","age","gender")

    val df: Dataset[Row] = session.read.format("org.apache.spark.sql.execution.datasources.v2.text.TextDataSourceV2")
      .load("file:///headless/workspace/spark/data/a.txt")

    val rdd = session.sparkContext.textFile("file:///headless/workspace/spark/data/a.txt")
    rdd.toDS()
    rdd.toDF()

    df.rdd
    ds.rdd
相关推荐
不是万能的豆学长3 小时前
filetidy 文件整理助手:一键归类 + 规范重命名(Python 零依赖单文件工具)
大数据·开发语言·python·技术美术
库库的数据库笔记9 小时前
国产信创数据库的MySQL兼容性深度对比解析
大数据·数据库·mysql·oceanbase·政务
Elastic 中国社区官方博客10 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
珠海西格电力12 小时前
零碳园区管理系统的性能评估体系的行业标准
大数据·网络·人工智能·物联网·机器学习·架构·能源
杨先生哦12 小时前
SOC告警研判实战:海量告警降噪、误报甄别、内网风险处置全流程(上岗必用)
大数据
一线数智13 小时前
朱鹰:人的判断力,比算力更重要
大数据·人工智能
用户36105886261213 小时前
Flink ResourceManager启动流程源码深度剖析:从ClusterEntrypoint到Slot分配的完整链路
大数据
用户36105886261214 小时前
Flink ApplicationMaster启动流程源码深度剖析:从YARN提交到JobMaster启动的完整链路
大数据·flink
初心未改HD14 小时前
DSH Skill开发实战:SKILL.md是给LLM看的操作手册,不是给人看的README,踩了4个坑
java·大数据·开发语言
程序 代码狂人15 小时前
据仓库常见表类型详解(面试完整版,金融数仓适用)
大数据