数据操作——Column 对象

news2024/12/26 3:30:28

Column 对象

1. 什么是Column对象

  • Column 表示了 Dataset 中的一个列, 并且可以持有一个表达式, 这个表达式作用于每一条数据, 对每条数据都生成一个值

2.Column对象如何创建

  • 单引号 ’ 在 Scala 中是一个特殊的符号, 通过 ’ 会生成一个 Symbol 对象, Symbol 对象可以理解为是一个字符串的变种, 但是比字符串的效率高很多, 在 Spark 中, 对 Scala 中的 Symbol 对象做了隐式转换, 转换为一个 ColumnName 对象, ColumnName 是 Column 的子类, 所以在 Spark 中可以如下去选中一个列

    
    val ds= Seq(Person("zhangsan", 12), Person("zhangsan", 8), Person("lisi", 15)).toDS()
    // ' 必须导入spark的隐式转换才能使用 str.intern()
    val c1: Symbol = 'name
    
  • $

    同理, $ 符号也是一个隐式转换, 同样通过 spark.implicits 导入, 通过 $ 可以生成一个 Column 对象

    val ds= Seq(Person("zhangsan", 12), Person("zhangsan", 8), Person("lisi", 15)).toDS()
    // $ 必须导入spark的隐式转换才能使用
    val column1: ColumnName = $"name"
    
  • col

    SparkSQL 提供了一系列的函数, 可以通过函数实现很多功能, 在后面课程中会进行详细介绍, 这些函数中有两个可以帮助我们创建 Column 对象, 一个是 col, 另外一个是 column

    val ds= Seq(Person("zhangsan", 12), Person("zhangsan", 8), Person("lisi", 15)).toDS()**
    
    **import org.apache.spark.sql.functions._
    // col 必须导入 functions
    val column2: sql.Column = col("name")
    
  • column

    val ds= Seq(Person("zhangsan", 12), Person("zhangsan", 8), Person("lisi", 15)).toDS()
    
    // column 必须导入 functions
    val column3: sql.Column = column("name")
    
    // 上面这四种创建方式,有关联的 Dataset 部分
    ds.select(column).show()
    // Dataset 可以,DataFrame 可以使用 Column 对象选中行吗?
    df.select(column).show()
    // select 方法可以使用 column 对象来选中某个列,那么其他的算子行吗?
    df.where(column === "zhangsan").show()
    
    // coLumn有几个创建方式,四种
    // column对象可以用作于 Dataset 和 DataFrame 中
    // column可以和命令式的弱类型的 API 配合使用 select where
    

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  • Dataset.col

    面的 Column 对象创建方式所创建的 Column 对象都是 Free 的, 也就是没有绑定任何 Dataset, 所以可以作用于任何 Dataset, 同时, 也可以通过 Dataset 的 col 方法选择一个列, 但是这个 Column 是绑定了这个 Dataset 的, 所以只能用于创建其的 Dataset 上

    val ds: Dataset[Person] = Seq(Person("zhangsan", 12), Person("zhangsan", 8), Person("lisi", 15)).toDS()
    val ds1: Dataset[Person] = Seq(Person("zhangsan", 12), Person("zhangsan", 8), Person("lisi", 15)).toDS()
    
    // dataset.col
    //使用 dataset 来获取column 对象,会和某个 Dataset 进行绑定,在逻辑计划中,就会有不同的表现
    val column4 = ds.col("name")
    val column5 = ds1.col("name")
    
    //    ds.select(column5).show() 报错
    // 为什么要和 dataset 来绑定呢
    ds.join(ds1, ds.col("name") === ds1.col("name"))
    .select(column5).show() // 成功
    

    在这里插入图片描述

  • Dataset.apply

    可以通过 Dataset 对象的 apply 方法来获取一个关联此 Dataset 的 Column 对象

    ds(“name”)

    ds.apply(“name”) 上下两个是一样的,ds(“name”)其实是ds.apply(“name”)简写版

    val ds: Dataset[Person] = Seq(Person("zhangsan", 12), Person("zhangsan", 8), Person("lisi", 15)).toDS()
    
    val column6 = ds.apply("name")
    
    val column7 = ds(“name”)
    

3.别名和转换

  • as[type]

    as 方法有两个用法, 通过 as[Type] 的形式可以将一个列中数据的类型转为 Type 类型

    val ds: Dataset[Person] = Seq(Person("zhangsan", 12), Person("lisi", 15)).toDS()
    
    ds.select('age.as[Long])
    
  • as(name)

    通过 as(name) 的形式使用 as 方法可以为列创建别名

    @Test
    def as(): Unit = {
      val ds: Dataset[Person] = Seq(Person("zhangsan", 12), Person("lisi", 15)).toDS()
    
      // select name, count(age) as age from table group by name
      ds.select('name as 'new_name).show()
    
    }
    

    在这里插入图片描述

4.添加列

  • withColumn

    通过 Column 在添加一个新的列时候修改 Column 所代表的列的数据

    @Test
      def api(): Unit = {
        val ds:Dataset[Person]=Seq(Person("zhangsan",15),Person("lisi",10)).toDS()
        // 需求一,ds增加列,双倍年龄
        // 'age*2 其实本质上就是将一个表达式(逻辑计划表达式)附着到column对象上
        // 表达式在执行的时候对应每一条数据进行操作
        ds.withColumn("doubled",'age * 2).show()
      }
    

    在这里插入图片描述

5.操作

  • like

    通过 Column 的 API, 可以轻松实现 SQL 语句中 LIKE 的模糊查询功能

    @Test
    def api(): Unit = {
      val ds:Dataset[Person]=Seq(Person("zhangsan",15),Person("lisi",10)).toDS()
      
      //需求二,便糊查湖
      ds.where('name like "zhang%").show()
    }
    

在这里插入图片描述

  • isin

    通过 Column 的 API, 可以轻松实现 SQL 语句中 ISIN 的枚举判断功能

    @Test
    def api(): Unit = {
      val ds:Dataset[Person]=Seq(Person("zhangsan",15),Person("lisi",10)).toDS()
      
      // 需求三,枚举判断
      ds.where('name isin ("zhangsan", "wangwu", "zhaoliu")).show( )
    }
    

    在这里插入图片描述

  • sort

    在排序的时候, 可以通过 Column 的 API 实现正反序

    @Test
    def api(): Unit = {
      val ds:Dataset[Person]=Seq(Person("zhangsan",15),Person("lisi",10)).toDS()
    
      // 需求四,排序正反序
      ds.sort('age asc).show()
      
    }
    

    在这里插入图片描述

  • 以上代码的前置条件

    val spark = SparkSession.builder().appName("column").master("local[6]").getOrCreate()
    
    import spark.implicits._
    
    case class Person(name: String, age: Int)
    

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

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

相关文章

如何自己实现一个Spring Boot Starter

现在很多开源的组件都会提供对应的 springboot-starter 包给我们去用,要做一个 starter 包并不难。参照Spring内置的实现就好了: 1、在工程里引入 starter 打包相关的依赖。 2、在我们工程内建 spring.factories 文件,编写我们配置类的全限类…

ETLCloud:实现数据库快速输入输出的利器

在当今大数据时代,数据的高效处理和管理成为企业发展的关键。而数据库作为数据存储和管理的核心,其输入输出效率的提升对于企业来说至关重要。ETLCloud数据集成工具,为企业提供了快速、灵活、稳定的数据库输入输出解决方案,极大地…

最好的超声波清洗机有哪些?怎么样能选购到好用超声波清洗机?

眼镜党们在挑选超声波清洗机时候真的会非常苦恼,市面上的超声波清洗机品牌真的五花八门,让人挑得眼花缭乱,作为一个佩戴眼镜时间超达10年,使用超声波清洗机洗眼镜有五年的来说,我在选购超声波清洗机这条道路上吃的苦比…

线性代数:矩阵的定义

目录 一、定义 二、方阵 三、对角阵 四、单位阵 五、数量阵 六、行(列)矩阵 七、同型矩阵 八、矩阵相等 九、零矩阵 十、方阵的行列式 一、定义 二、方阵 三、对角阵 四、单位阵 五、数量阵 六、行(列)矩阵 七、同型矩…

04 单链表

目录 链表的概念和结构单链表OJ练习 1. 链表的概念和结构 1.1 链表的概念 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 1.从上图可以看出链式结构在逻辑上是连续的,物理上不一定连续 2.现…

SpringBoot之文件上传

1、文件上传原理😘 表单的enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。 当表单的enctype"application/x-www-form-urlencoded"(默认)时,form表单中的数据格式为:keyvalue&keyvalue …

༺༽༾ཊ—Unity之-01-单例模式—ཏ༿༼༻

在游戏开发过程中,我们会创建各种各样的类,再用new生成实例,有些时候我们需要这个类在整个游戏中是唯一出现的,比如一些管理器比如声音管理器等,没必要创建很多实例,就算有很多模块需要各种声音功能&#x…

【C++】模板类vector的简单实现

文章目录 1. 迭代器2.构造和析构3. 容量4. 访问5.修改6.测试完整代码总结: 在C的STL库中,vector是一个非常常用的容器,它提供了动态数组的功能。今天我们将一起来实现一个简化版的vector模板类,以便更好地理解它的原理和实现过程。…

红日靶场2打点记录

因为之前成功用冰蝎免杀360,把权限反弹到了MSF上,然后MSF把权限反弹到CS上 所以这次咱们走捷径直接通过反序列化漏洞连接(就是关掉360)因为权限弹来弹去感觉好麻烦 提示 大家如果想要免杀360千万别学我,我是之前免杀3…

springboot116基于java的教学辅助平台

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的基于java的教学辅助平台 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四…

前后端分离项目中实现图形验证码

图形验证码在我们的日常生活中时经常用到的,一般用于用户的登录、注册等。 图形验证码在互联网应用中的作用是提高安全性、防止滥用和保护用户隐私。它是一种简单而有效的人机验证技术,帮助保护系统和用户免受自动化攻击的影响。 本次我们通过spring b…

【深度学习每日小知识】NLP 自然语言处理

自然语言处理 (NLP) 是人工智能 (AI) 的一个子领域,处理计算机和人类(自然)语言之间的交互。它涉及使用算法和统计模型使计算机能够理解、解释和生成人类语言。 NLP 是人工智能领域的重要工具,广泛应用于语言翻译、文本分类和聊天…

短信平台搭建注意什么|网页版短信系统开发源码

短信平台搭建注意什么|网页版短信系统开发源码 短信平台是企业进行市场营销、客户关系管理和即时通讯的重要工具。为了确保短信平台的稳定运行和高效利用,以下是在搭建短信平台时需要注意的几个重要方面。 1. 需求分析:在搭建短信平台之前,需…

Springboot+vue的校园疫情防控系统(有报告),Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的校园疫情防控系统(有报告),Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的校园疫情防控系统,采用M&#xff…

实时语音克隆,准确复制音色:OpenVoice | 开源日报 No.150

myshell-ai/OpenVoice Stars: 9.6k License: NOASSERTION OpenVoice 是一个通过 MyShell 进行即时语音克隆的开源项目。 OpenVoice 可以准确地克隆参考音色,并生成多种语言和口音的语音。OpenVoice 允许对声音风格进行细粒度控制,如情感、口音以及节奏…

数据库入门:快速了解数据库

目录 序言 一、什么是数据库? 二、DBMS 数据库管理系统(DataBase Management System) 三、数据库与文件系统的区别 四、数据库的发展和规划 五、常见数据库 5.1 关系型数据库 5.2 非关系型数据库 六、DBMS支持的数据模型 6.1 层次模…

【代码实战】从0到1实现transformer

获取数据 import pathlibimport tensorflow as tf# download dataset provided by Anki: https://www.manythings.org/anki/ text_file tf.keras.utils.get_file(fname"fra-eng.zip",origin"http://storage.googleapis.com/download.tensorflow.org/data/fra-…

Ultimate Crafting System

终极制作系统是您制作游戏的完整解决方案。从流畅的物品和配方创建的基础知识到强大的放置和能量转移系统,它拥有一切。可用于3D和2D游戏。非常适合独立简单的游戏,但程序员可以扩展其终极力量! — 内容 — - 点击式第三人称演示场景 - 第一人称演示场景 - 库存系统 - 从易于…

PIG框架学习3——Redisson 实现业务接口幂等

零、前言 ​ 业务接口幂等问题是在开发中遇到的,如果对业务接口代码不进行幂等控制,并且在前端没有对请求进行限制的情况下,可能会出现多次对接口调用,导致错误异常的发生。就上述情况,对PIGX自带的业务接口幂等实现进…

sql数据库的相关概念与底层介绍

本文中的数据库指的是磁盘数据库。如果有sql语言(CRUD,增删改查)的使用经验会更容易理解本文的知识点。 数据库与redis的区别 数据库:数据存储长期在磁盘中,小部分频繁需要的数据会被临时提取在内存中。 Redis&…