目录
8.3 Column 对象
8.3.1 列的创建
8.3.2 列的别名和转换
8.3.3 添加列
8.3.4 其它
8.3 Column 对象
导读
Column 表示了 Dataset 中的一个列, 并且可以持有一个表达式, 这个表达式作用于每一条数据, 对每条数据都生成一个值, 之所以有单独这样的一个章节是因为列的操作属于细节, 但是又比较常见, 会在很多算子中配合出现
8.3.1 列的创建
列的创建操作主要包含:' 、$ 、col 、column 、Dataset.col 、Dataset.apply
(1)'
方法描述:单引号 ' 在 Scala 中是一个特殊的符号, 通过 ' 会生成一个 Symbol 对象, Symbol 对象可以理解为是一个字符串的变种, 但是比字符串的效率高很多, 在 Spark 中, 对 Scala 中的 Symbol 对象做了隐式转换, 转换为一个 ColumnName 对象, ColumnName 是 Column 的子类, 所以在 Spark 中可以如下去选中一个列
import spark.implicits._
//1. ' 必须导入spark的隐式转换
val column: Symbol = 'name
(2)$
方法描述:同理, $ 符号也是一个隐式转换, 同样通过 spark.implicits 导入, 通过 $ 可以生成一个 Column 对象
import spark.implicits._
//2. $ 必须导入spark的隐式转换
val column1: ColumnName = $"name"
(3)col
方法描述:帮助我们创建 Column 对象
//3. col 必须导入functions
import org.apache.spark.sql.functions._
val column2: sql.Column = col("name")
(4)column
方法描述:帮助我们创建 Column 对象
//4. column 必须导入functions
val column3: sql.Column = column("name")
小结一下:上面这四种创建方式,创建后都具有关联的Dataset可以对其操作
//column有上面这四种创建方式,创建后都具有关联的Dataset
ds.select(column).show()
//column对象可以作用于Dataset和DataFrame中
df.select(column).show()
//column可以和命令式的弱类型的API配合使用select where
df.where(column === "zhangsan").show()
(5)Dataset.col
方法描述:前面的 Column 对象创建方式所创建的 Column 对象都是 Free 的, 也就是没有绑定任何 Dataset, 所以可以作用于任何 Dataset, 同时, 也可以通过 Dataset 的 col 方法选择一个列, 但是这个 Column 是绑定了这个 Dataset 的, 所以只能用于创建其的 Dataset 上
//5. dataset.col
val column4: sql.Column = ds.col("name")
val column5: sql.Column = ds1.col("name")
//使用dataset来获取column对象,会和某个Dataset进行绑定,在逻辑计划中,就不会有不同的表现
//ds.select(column5).show() 这种写法会报错
//为什么和dataset来绑定呢?
ds.join(ds1,ds.col("name") === ds1.col("name"))
//绑定后可以进行其它表的关联操作
(6)Dataset.apply
方法描述:可以通过 Dataset 对象的 apply 方法来获取一个关联此 Dataset 的 Column 对象
//6. dataset.apply
val ds = Seq(Person("zhangsan",15),Person("lisi",10)).toDS()
val column6: sql.Column = ds.apply("name")
val column7: sql.Column = ds("name") //上面这种的简写
8.3.2 列的别名和转换
列的别名和转换操作主要包含:as[Type]、as(name)
(1)as[Type]
方法描述:as 方法有两个用法, 通过 as[Type] 的形式可以将一个列中数据的类型转为 Type 类型
(2)as(name)
方法描述:通过 as(name) 的形式使用 as 方法可以为列创建别名
@Test
def as():Unit = {
val ds = Seq(Person("zhangsan",15),Person("lisi",10)).toDS()
//select name as new_name,count(age) as age from table group by name
ds.select('name as "new_name").show() //取别名
ds.select('age.as[Long]).show() //类型转换
}
8.3.3 添加列
列的添加操作主要包含:withColumn
(1)withColumn
方法描述:通过 Column 在添加一个新的列时候修改 Column 所代表的列的数据
val ds: Dataset[Person] = Seq(Person("zhangsan",15),Person("lisi",10)).toDS();
//1. ds增加列,双倍年龄
// 'age * 2 其实本质上就是将一个表达式(逻辑计划表达式)附着到column对象上
// 表达式在执行的时候对应每一条数据进行操作
ds.withColumn("doubled",'age * 2).show()
8.3.4 其它
列的其它操作:like、isin、sort
(1)like
方法描述:通过 Column 的 API, 可以轻松实现 SQL 语句中 LIKE 的功能
//2. 模糊查询
ds.where('name like "zhang%").show()
(2)isin
方法描述:通过 Column 的 API, 可以轻松实现 SQL 语句中 ISIN 的功能
//3. 排序,正反序
ds.sort('age asc).show()
(3)sort
方法描述:在排序的时候, 可以通过 Column 的 API 实现正反序
//4. 枚举判断
ds.where('name isin ("zhangsan","wangwu","zhaoliu")).show()