当前位置: 首页 > news >正文

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

1. 概念:

RDD:

弹性分布式数据集;

DataFrame:

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

DataFrame 是 DataSet[Row]

DataSet:

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

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

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

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

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

package com.hainiu.sparkimport 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. 三者之间的转换

  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.rddds.rdd

http://www.lryc.cn/news/496220.html

相关文章:

  • zerotier实现内网穿透
  • Ardusub源码剖析——control_althold.cpp
  • Vue前端开发-路由的基本配置
  • HarmonyOS JSON解析与生成 常用的几个方法
  • Docker 进阶指南:常用命令、最佳实践与资源管理
  • 【前端】特殊案例分析深入理解 JavaScript 中的词法作用域
  • Jmeter进阶篇(29)AI+性能测试领域场景落地
  • 理解和应用 Python Requests 库中的 .json() 方法:详细解析与示例
  • docker 运行my-redis命令
  • cloudstack概要及单节点安装部署
  • Android Gradle 相关
  • SpringMVC:入门案例
  • LuaForWindows_v5.1.5-52.exe
  • 密码学实验工具--Cryptool2
  • 量化交易系统开发-实时行情自动化交易-8.1.TradingView平台
  • Vue2 常见知识点(二)
  • SAP-ABAP开发-第二代增强示例
  • UDP 协议与端口绑定行为解析:理解 IP 地址和端口的绑定规则
  • 【Vue3】【Naive UI】<n-message>标签
  • C++ 变量和常量:开启程序构建之门的关键锁钥与永恒灯塔
  • Linux部分实用操作
  • Linux笔记---进程:进程地址空间
  • flutter in_app_purchase google支付 PG-GEMF-01错误
  • “精神内耗”的神经影像学证据:担忧和反刍会引发相似的神经表征
  • Linux--Debian或Ubuntu上扩容、挂载磁盘并配置lvm
  • 【k8s】kubelet 的相关证书
  • 01-树莓派基本配置-基础配置配置
  • 【Windows 11专业版】使用问题集合
  • 前端 vue3 + element-plus + ts 组件通讯,defineEmits,子传父示例
  • 【Django-xadmin】