开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:无类型转换_选择】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12075
无类型转换_选择
我们了解过了有类型的转换算子,并且能看到有类型的转换算法当中,其实大部分转换,那么它里面会接收函数,会处理具体的某一个类型的对象。那么接下来呢,我们要去介绍一下无类型的转换算子。简单来说,无类型的转换算法大多是利用这个 scheme 列信息进行操作。
比如说要去选中某一列,要去按照每一列来做什么样的一件事情。那么称之为叫做无类型的算子。那当然会有一些聚合之类的算子,放在单独的专题里面进行讲解。
无类型的算子其实要说的并不多,分别是选择类,新建列,剪除和聚合这四类。通过选择这一类,就能够知道应该把什么样的值怎么放到结果。比如说现在希望往结果集里面放入四个列的值,该怎么放?进入到 idea 当中,去创建一个新的 class
class UntypedTransformation{
val spark = SparkSession.builder().master(master =”local[6]”).appName(name =”typed”),getOrCreate()
Import spark.implicits._
创建一个新的文件,文件名 select
def select(): Unit = {
val ds= ( Seq(Person(“zhangsan”,12),
Person(“list”,18),Person(“zhangsan”8)).toDS()
//创建数据集为 ds,通过 toDS 转换为 Dataset
ds.select( cols =’name).show()
//想在结果集里面只有一个 name 可以使用这个方法,还有其他方法,那么这个时候,在这个 SQL 语句当中,经常写为 select*from....,这是一个相当不科学的写法。
之前学的这个 SQL 语句就是这样,所以现在看到这句话不觉得有问题。但是其实真正符合正常人类的这个理解过程,然后包括这个信息组织过程的,应该是 from.....select.....语句。虽然后面因为一些工具,比如说 Spark,它就去解决了这样一个问题,
但没有多少人用 Spark。在 Spark 当中,这个 select( cols =’name)不是必须要放第一位的,在 select 之前,你可以做很多操作。比如说可以 ds.sort,然后可以做许多其它的事情,最后 select 。
不是 select 和 SQL 语句一摸一样,要去掉固定的思考方式。Spark 当中经常最后才去 select ,也就是从一个结果集进行一系列处理,聚合连接和转换等操作全部弄完了,最后 select。
小知识点:在 Dataset 当中,select 可以在任何位置调用。
ds.selectExpr( exprs=”sum(age)”).show()
import org.apache,spark.sql.functions._
ds.select( expr=”sum(age)”).show()
//在写 SQL 语句的时候,经常会写 select count(*),这个在 Dataset 当中也可以使用。
先来运行一下,结果已经获取到了第一个结果,这样的一个结果只打印了 name 的这个内容.
接下来继续找。看到了这个 sum(age)这个表达式,这个表达式对最终对应你的年龄是 38 岁。
简单扩展,引入一个新概念,在 select 当中是没有办法写表达式的。想用 select 又要支持表达式,
就要 import org.apache,spark.sql.functions._把所有内容导入进去,接下来,就在这个 select 当中,就可以使用一个叫做 expr 的函数 ds.select( expr=”sum(age)”),这样就实现了与 selectExpr 一样的功能。
那么这个东西 functions 我们称之为叫做函数,这个里面的函数其实非常的好,也非常的多。这些函数经常会配合 select 等之类的算子拿去和使用。
比如说 expert,它的含义其实把字符串转成一个一个逻辑。然后转成这个执行计划。那么这就是解析表达式的概念。
运行一下,已经看到结果是 38,与之前一样。这就是我们整个的执行过程与运算方式。