数据操作——Column 对象

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)
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

优先级队列(堆) PriorityQueue

🎥 个人主页:Dikz12📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香欢迎大家👍点赞✍评论⭐收藏 目录 1.优先级队列 2.优先级队列的模拟实现 2.1 堆的概念 2.2 堆的创建 2.3 堆的插入和删除 2.…

数据结构——二叉树

目录 一、前言 1.1 树 1.2 树的相关概念 二、二叉树 2.1 定义 2.2 特殊类型 2.3 二叉树的性质 2.4 二叉树的存储结构 (1)顺序存储 (2)链式存储 三、二叉树相关操作 3.1 创建一颗二叉树 3.2 二叉树的遍历 &#xff…

构建STM32MP133的Buildroot环境

意法半导体ST在坚持用 Yocto构建他们的OpenSTLinux MP1系列MCU,编译费劲,而且我们的应用不需要Yocto的环境,所以基于Buildroot的最小Linux系统更适合我们。 STM32MP133微处理器基于单Arm Cortex-A7内核,运行频率可达1 GHz&#x…

JVM对象创建与内存回收机制

对象的创建过程有如下步骤: 1.类加载检查: 虚拟机遇到一个new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过,如果没…

带POE网络变压器与2.5G/5G/10G网络变压器产品特点介绍

Hqst华轩盛(石门盈盛)电子导读:一起来了解带POE网络变压器与2.5G/5G/10G网络变压器产品特点? 一﹑带POE网络变压器与2.5G/5G/10G网络变压器产品特点介绍 首先、POE网络变压器产品与常规不带POE产品的区别: 带POE网络变压器主要要求是耐电流等…

mycat实现mysql读写分离

一. mycat集群HaproxyKeepalived mycat集群HaproxyKeepalivedmysql1主2从 环境规划 centos7.9 1主2从,读写分离 名称ip端口mysql-master192.168.1.2203306mysql-slave1192.168.1.2213306mysql-slave2192.168.1.2223306mycat-1192.168.1.2218066mycat-2192.168.1.…

【学习笔记】遥感影像分类相关精度指标

文章目录 0.混淆矩阵1. 精度名词解释2. Kappa系数3.举个栗子参考资料 0.混淆矩阵 混淆矩阵是分类精度的评定指标。是一个用于表示分为某一类别的像元个数与地面检验为该类别数的比较阵列。 对检核分类精度的样区内所有的像元,统计其分类图中的类别与实际类别之间的…

【服务器】搭建一台属于自己的服务器

​🌈个人主页:Sarapines Programmer🔥 系列专栏:【服务器】搭建网站⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 1. 购买服务器和域名 1.1 购买服务器 1.1.1 阿里云服务器 1.1.2 香草云服务器 1.2 购买域名 2. 安装宝塔…

JAVA和C++ SECS/GEM300开发和概念

编译SECS示例程序 1. 示例程序使用默认路径: D:\SECS 稳定版\SECS Debug\ 2. 该操作分为俩步 ① 将C#的Secs库编译成设备相同Net版本。 如.net3.5、4.0、4.5等等 ② 编译金南瓜SECS demo程序 编译C#的SecsEquip.dll 1. 找到SecsEquip项目 项目文件 使用Visua…

python24.1.21面向对象编程

面向对象编程:创建对象,定义对象的方法和属性 封装:隐藏内部实现细节,只通过外部接口访问使用 继承:允许创建有层次的类(子类,父类) 多态:同样接口,对象具体…

力扣343. 整数拆分(动态规划)

Problem: 343. 整数拆分 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 该题目可以抽象成动态规划中的爬楼梯模型,将整数的拆分类比为上台阶: 1.每个阶段可以从整数中划分出1、2、…k的一个整数 2.int dp[n 1] dp[i]表示为i的整数划分的最大…

【Python从入门到进阶】47、Scrapy Shell的了解与应用

接上篇《46、58同城Scrapy项目案例介绍》 上一篇我们学习了58同城的Scrapy项目案例,并结合实际再次了项目结构以及代码逻辑的用法。本篇我们来学习Scrapy的一个终端命令行工具Scrapy Shell,并了解它是如何帮助我们更好的调试爬虫程序的。 一、Scrapy Sh…

一个很牛的库:csckit!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、什么是Python csvkit?二、csvkit 的主要特点三、安装Python csvkit四 基本用法读取CSV文件五使用Python库进行高级操作总结 前言 大家好&#…

Oracle篇—参数文件在11gRAC或12cRAC的启动位置介绍

☘️博主介绍☘️: ✨又是一天没白过,我是奈斯,DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣…

flutter项目怎么判断是不是web平台?Unsupported operation: Platform._operatingSystem

如果你使用Platform 这个工具来判断的时候,很有可能会报错: Exception caught by widgets library The following UnsupportedError was thrown building MyApp(dirty): Unsupported operation: Platform._operatingSystem The relevant error-causin…

分布式锁的产生以及使用

日常开发中,针对一些需要锁定资源的操作,例如商城的订单超卖问题、订单重复提交问题等。 都是为了解决在资源有限的情况限制客户端的访问,对应的是限流。 单节点锁问题 目前针对这种锁资源的情况采取的往往是互斥锁,例如 java 里…

Node+Express编写接口---前端

前端页面 vue_node_admin: 第一个以node后端,vue为前端的后台管理项目https://gitee.com/ah-ah-bao/vue_node_admin.git

1.1 数据库概述

1.1 数据库概述 1.1.1 数据库基本概念 - 数据(Data) - 数据库(DataBase,DB) - 数据库管理系统(DataBase Management System,DBMS) - …

【C++】List模拟实现过程中值得注意的点

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.List迭代器 2.适…

AI对比:ChatGPT与文心一言的异同与未来

文章目录 📑前言一、ChatGPT和文心一言概述1.1 ChatGPT1.2 文心一言 二、ChatGPT和文心一言比较2.1 训练数据与知识储备2.2 语义理解与生成能力2.2 应用场景与商业化探索 三、未来展望3.1 模型规模与参数数量不断增加3.2 多模态交互成为主流3.3 知识图谱与大模型的结…