SparkSQL——DataFrame

news2025/2/24 14:06:52

DataFrame

  • Dataframe 是什么

    DataFrameSparkSQL中一个表示关系型数据库中 的函数式抽象, 其作用是让 Spark处理大规模结构化数据的时候更加容易. 一般 DataFrame可以处理结构化的数据, 或者是半结构化的数据, 因为这两类数据中都可以获取到 Schema信息. 也就是说 DataFrame中有 Schema信息, 可以像操作表一样操作 DataFrame.

    在这里插入图片描述

    DataFrame 由两部分构成, 一是 row的集合, 每个 row对象表示一个行, 二是描述 DataFrame结构的 Schema

    在这里插入图片描述

    DataFrame支持 SQL中常见的操作, 例如: select, filter, join, group, sort, join

    • code
    @Test
      def dataframe1(): Unit = {
        // 1. 创建 SparkSession 对象
        val spark = SparkSession.builder()
          .master("local[6]")
          .appName("dataframe1")
          .getOrCreate()
    
        // 2. 创建 DataFrame
        import spark.implicits._
    
        val dataFrame: DataFrame = Seq(Person("zhangsan", 15), Person("lisi", 20)).toDF()
        // 3. 看看 DataFrame 可以玩出什么什么花样
        // select name from t where t.age >10
        dataFrame.where('age > 10)
          .select( 'name)
          .show()
      }
    
    case class Person(name: String, age: Int)
    

    在这里插入图片描述

  • DataFrame 如何创建

    DataFrame如何创建数据集【BeijingPM20100101_20151231_noheader.rar】

    @Test
      def dataframe2():Unit = {
        val spark = SparkSession.builder()
          .master("local[6]")
          .appName("dataframe2")
          .getOrCreate()
    
        import spark.implicits._
    
        val personList = Seq(Person("zhangsan", 15), Person("lisi", 20))
    
        // 创建 DataFrame 的方法
        // 1.toDF
        val df1 = personList.toDF()
        val df2 = spark.sparkContext.parallelize(personList).toDF() // RDD.toDf()
        // 2. createDatFrame
        val df3 = spark.createDataset(personList)
        // 3. read 
        val df4 = spark.read.csv("./dataset/BeijingPM20100101_20151231_noheader.csv")
        df4.show()
      }
    
    case class Person(name: String, age: Int)
    

    在这里插入图片描述

    在这里插入图片描述

  • DataFrame 操作 (案例)

    DataFrame操作数据集[BeijingPM20100101_20151231.rar]

    需求:查看 PM_Dongsi 每个月的统计数量

    object DataFrameTest {
      def main(args: Array[String]): Unit = {
        // 1. 创建SparkSession
        val spark = SparkSession.builder()
          .master("local[6]")
          .appName("pm_analysis")
          .getOrCreate()
    
        import spark.implicits._
        // 2. 读取数据集
        val sourceDF = spark.read
          .option("header",true) // 把表头读取出来
          .csv("./dataset/BeijingPM20100101_20151231.csv")
        //sourceDF.show()
        //查看DataFrame 的 schema 信息,要意识到 DataFrame 中是有结构信息的,叫做Schema
        sourceDF.printSchema()
        // 3. 处理
        //    1. 选择列
        //    2. 过滤 NA 的 PM记录
        //    3. 分组 select year, month, count(PM_Dongsi) from .. where PM_Dongsi != NA group by year, month
        //    4. 聚合
        // 4. 得出结论
        sourceDF.select('year,'month,'PM_Dongsi)
          .where('PM_Dongsi =!= "NA") // 过滤 NA 的 PM记录
          .groupBy('year,'month)
          .count()
          .show() // action
    
        // 是否能支持使用 SQL 语句进行查询
        println("---------接下来是SQL语句查询的--------------")
        // 1. 将 DataFrame 注册为临时表
        sourceDF.createOrReplaceTempView("pm")
    
        // 2. 执行查询
        val resultDF = spark.sql("select year, month, count(PM_Dongsi) from pm where PM_Dongsi != 'NA' group by year,month")
    
        resultDF.show()
    
        spark.stop()
      }
    }
    

总结

  1. DataFrame 是一个类似于关系型数据库表的函数式组件
  2. DataFrame 一般处理结构化数据和半结构化数据
  3. DataFrame 具有数据对象的 Schema 信息
  4. 可以使用命令式的 API 操作 DataFrame, 同时也可以使用 SQL 操作 DataFrame
  5. DataFrame 可以由一个已经存在的集合直接创建, 也可以读取外部的数据源来创建

小Tips

一般处理数据都差不多是ETL这个步骤

  • E -> 抽取
  • T -> 处理转换
  • L -> 装载,落地

Spark代码编写的套路:

  • 创建DataFrame Dataset RDD,制造或者读取数据
  • 通过DataFrame Dataset RDD的API来进行数据处理
  • 通过DataFrame Dataset RDD进行数据落地

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1391537.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2018年认证杯SPSSPRO杯数学建模B题(第一阶段)动态模糊图像全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 B题 动态模糊图像 原题再现: 人眼由于存在视觉暂留效应,所以看运动的物体时,看到的每一帧画面都包含了一段时间内 (大约 1/24 秒) 的运动过程,所以这帧画面事实上是模糊的。对电影的截图来说&…

eNSP学习——终端直连三层网关设备进行通信

VLAN 配置 一 . 功能简介 将设备中的某些接口定义为一个单独的区域,将指定接口加入到指定 VLAN 中之后,接口就可以转发 指定 VLAN 报文。从而实现 VLAN 内的主机可以直接通信,而 VLAN 间的主机不能直接互通,将广播报文 …

前端安全相关

请求后端接口必须带上sign 以上主要是解决:除了数据泄露外,一些重要功能的接口如果没有做好保护措施也会被恶意调用造成DDoS、条件竞争等攻击效果 一些营销活动类的Web页面,领红包、领券、投票、抽奖等活动方式很常见。此类活动对于普通用户…

Linux miniGUI移植分析

框架介绍 常用GUI程序对比 https://www.cnblogs.com/zyly/p/17378659.html MiniGUI分为底层的GAL(图形抽象层)和IAL(输入抽象层),向上为基于标准POSIX接口中pthread库的Mini-Thread架构和基于Server/Client的Mini-L…

WebGL中开发AR应用

WebGL在本质上是用于在浏览器中进行3D和2D图形渲染的技术,而增强现实(AR)通常需要与现实世界的环境进行交互。要在WebGL中开发AR应用,您可以采取以下步骤,希望对大家有所帮助。北京木奇移动技术有限公司,专…

固定拍摄点位下的NeRF技术应用(算法探讨)

NeRF(神经辐射场)技术可以用于物体定位。NeRF 是一种深度学习方法,它通过对场景的大量照片进行训练来创建三维场景的高度逼真的渲染。这项技术能够从多个角度捕捉场景的细节,并通过神经网络理解场景的三维结构。 使用 NeRF 进行物…

容器部署的nextcloud配置onlyoffice时开启密钥

容器部署的nextcloud配置onlyoffice时开启密钥 配置 进入onlyoffice容器 docker exec -it 容器id bash编辑配置vi /etc/onlyoffice/documentserver/local.json enable设置为true,并配置secret 重启容器,并将配置的密钥填入nextcloud密钥页面 docker r…

协方差矩阵自适应调整的进化策略(CMA-ES)

关于CMA-ES,其中 CMA 为协方差矩阵自适应(Covariance Matrix Adaptation),而进化策略(Evolution strategies, ES)是一种无梯度随机优化算法。CMA-ES 是一种随机或随机化方法,用于非线性、非凸函数的实参数(…

【每日小bug】mybatis plus id注解错误导致的问题

插入数据 id不为自增 指定了主键,没有指定自增。会导致出现 修改如上 报错 Data truncation: Out of range value for column ‘id’ at row 1 数据库是bigint,java中是Integer。 修改如上

现代工程科技杂志现代工程科技杂志社现代工程科技编辑部2023年第21期目录

能源科技 配网故障停电原因及改进对策研究 上官安琪 110kV变电站电气自动化技术及应用策略 陈祥 变电运维误操作事故预控措施分析 高翔;韦婉 智能变电站变电运维安全与设备维护探究 温亮亮;覃万全 110kV变电站电气设计及其防雷保护案例研析 谢旭平 变电运维…

springboot-简单测试 前端上传Excel表格后端解析数据

导入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxm…

力扣白嫖日记(sql)

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 610.判断三角形 表&#xff1a;Triangle 列名类型xintyintzint 在sql中&#xff0c;(x,y,z)是该表的主键列…

微信小程序---如何创建分包

1.在项目根目录中&#xff0c;创建分包的根目录&#xff0c;名为subpkg&#xff0c;这个名字可以自己定义 2.在 pages.json 中&#xff0c;和 pages 节点平级的位置声明 subPackages 节点&#xff0c;用来定义分包相关的结构&#xff1a; 3.在分包目录&#xff0c;点击右键新建…

变革在即:为什么您现在就需要将大型语言模型融入系统与产品开发

“有些问题看起来易于构想和展示原型&#xff0c;但将其发展成实际产品却极为艰难。比如自动驾驶&#xff1a;展示一辆汽车在街区自动行驶很简单&#xff0c;但要把这一技术转化为成熟的产品却需要十年时间。” - Karpathy 本文旨在探讨如何将大语言模型&#xff08;LLMs&#…

新能源汽车智慧充电桩方案:如何实现充电停车智慧化管理?

一、方案概述 基于新能源汽车充电桩的监管运营等需求&#xff0c;安徽旭帆科技携手合作伙伴触角云共同打造“智能充电设备&#xff0b;云平台&#xff0b;APP小程序”一体化完整的解决方案&#xff0c;为充电桩车位场所提供精细化管理车位的解决办法&#xff0c;解决燃油车恶意…

全面了解网络性能监测:从哪些方面进行监测?

目录 摘要 引言 CPU内存监控 磁盘监控 网络监控 GPU监控 帧率监控 总结 摘要 本文介绍了网络性能监测的重要性&#xff0c;并详细介绍了一款名为克魔助手的应用开发工具&#xff0c;该工具提供了丰富的性能监控功能&#xff0c;包括CPU、内存、磁盘、网络等指标的实时监…

布局数字隔离器件领域,世强硬创获中科格励微授权代理

近年来&#xff0c;因数字隔离器件传输速度更强、绝缘性能更强、可靠性更好等特点&#xff0c;正在快速替代光耦器件。 为推动国内数字隔离器产品终端应用&#xff0c;实现不同层次需求的国产替代&#xff0c;世强先进&#xff08;深圳&#xff09;科技股份有限公司&#xff0…

Android 布局菜鸟 android中的布局类型和特点?

一、LinearLayout(线性布局) 1、 特点: 主要以水平或垂直方式来排列界面中的控件。并将控件排列到一条直线上。在线性布局中,如果水平排列,垂直方向上只能放一个控件,如果垂直排列,水平方向上也只能放一个控件。 2、适⽤场景: Android开发中最常见的 ⼀种布局⽅式,排列…

新能源汽车智慧充电桩解决方案:智慧化综合管理与数字化高效运营

一、方案概述 TSINGSEE青犀&触角云新能源汽车智慧充电桩解决方案基于管理运营平台&#xff0c;覆盖业务与应用、数据传输与梳理、多端开发、搭建等模块&#xff0c;融合AI、5G、Wi-Fi 、移动支付等技术&#xff0c;实现充电基础设施由数字化向智能化演进&#xff0c;通过构…

SAP产品各版本简介

一、SAP名词解释 SAP Business Suite 当前SAP公司的主力产品包&#xff0c;里面包含了mySAP ERP, mySAP CRM, mySAP SCM …. 几乎是SAP的所有东东。如果购买的是此种许可证&#xff0c;就意味着几乎可以用SAP的所有产品的功能&#xff0d;&#xff0d;某些特定行业的特定引擎…