开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:无类型转换_列操作】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12076
无类型转换_列操作
如何去新建立列?
新建立所涉及的算子有两个,分别是 with column、with column renamed,一个是新建立,一个是重命名原来的这个列。
接下来进入到 idea 当中
def column():Unit ={
val ds= ( Seq(Person(“zhangsan”,12),
Person(“zhangsan”,18),Person(“list”,8)).toDS()
import org.apache,spark.sql.functions._
ds.withColumn(colName=“random”,expr(expr=”rand()”)).show()
//能看到现在是两列数据,一列叫做 name,还有一列叫做 age,如果想创建一个新的列,比如使用 ds.withColumn()就是用一个新的列增加一个新的列。
这时 with column 里面第一个参数接收列明,比如想增加一列,全都是 random 随机数,生成一个随机数的列,随机数该怎么生成?在我们的 SQL 语句当中是可以进行 select rand()from....操作的,也就是在 SQL 语句当中是有一个函数叫做 round,在 Spark 当中也有,比如说这个 expert 其实就是这个 function 的函数之一。这个 expert 是 functions 当中的其中一个函数,这个 functions 里面还有很多函数,比如说就有这个 round 的实现,还有 lift 之类的这样的一些实现,所以这个时候,还是可以在这使用 expr。
除了使用 expert 这种形式的函数以外,在这个表达式当中也可以写 rand,所以函数可以在两个方式上写。
做一个简单的小总结:
如果想使用函数的功能,有两种方式,第一种方式使用 functions.XX 这种函数,第二种形式就是使用表达式,可以使用 expert(“.....”)随时随地去编写表达式。
其实这个 function 方式当中也有 rand 的之类的这种东西,这样 expr(”rand()”)去用也行,但是其实没那么方便,那使用这种表达式的形式会稍微方便一点。
with column 整个的这样的一个方式,它表达的意思是为此一个列,这个列叫做 random,谁会死一个列,就是这个 Dataset 和一个列。就是用一个列,这个列叫做 random,后面是生成这个列的数据。之后可以进行相应的 show。
ds.withColumn(“name_new”, col =’name)
//了解一下其他的使用方式。首先 ds.withColumn 还能进行重命名,比如重命名为叫做 name new,然后在后面就可以使用这个单引号的形式去得到这样的一个列,这个列传给了这个 column 以后,其实代表的就是 column 当中的 name 列,然后给它命名为一个新的名字,叫做 name new,再去 show,就能看到结果是会有变化,
但是要注意一点,这个地方 col =’name 可以使用 name 这样的一个列,但是不能使用其他数据集当中的列。
以上就是这个 withColumn 的所有用法。可以对这个列 col =’name 来进行相应的操作,比如说加上东西或者乘上东西,以及除上东西。也可以进行等于的判断,不等于的判断。
ds.withColumn(“name_jok”,col=’name ===””).show
//比如说再来一个 dS .withColumn,创建一个 name,叫做 joke,这个结果集当中这个 name jok 列对应的应该是什么内容,不是 name 等于空的时候把”“显示出来。
运行一下,第一个结果是增加了一个 random 等列,后面全都是一些随机数,
第二个结果把这个 name 的列变成一个新的列,并且改名为 name_new。
第三个结果集,注意到这个地方 col=’name ===””使用三个等号和空字符串自行判断的时候,其实它显示出来的是这个比较的结果,也就是说这三个 name 全都不是空字符串,所以显示为 false,withColumn 它的功能跟 select 其实是相似 de,而你这种东西’name ===””,真正想去判断以及想去实现,比如说它等于空字符串,或者不等于空字符串才包含到这个结果集当中的话,那么应该把这样的一个判断表达式’name ===””放在 where 当中,这就是 withColumn。
Ds.withColumnRenamed(existing=“name”,newName=”new_name”).show()
详说第二个结果,是创建一个新的 column,对原来的 column 改了一个名字,但是接下来不想 new 出来一个新的 name,只想把原来的名字给改了,有一个疑问就是这个 withColumn 是不是永远只能先这个创建出来一个新的列,它起不到改名的作用?
可以把第二个结果中的旧的列删掉,创建一个新的列,但是不想这么麻烦,只想给原来的列改一个名字,就可以使用 ds withColumn remained,原来的名字 existing=“name”,后来的名字 newName=”new_name”。
运行这段代码,运行出结果,发现对原来的这一列已经改了一个名字 new_name。
withColumn 可以直接选中某一列改名字,也可以增加一个新的列去做一些这个判断,也可以通过函数,甚至一些自定义的函数,创建一个新的列,或者为旧列改名字。如果只想改名字的话,就使用 withColumn remained。
这就是有类型转换_列操作的内容。