Spark(三)-- SparkSQL扩展(数据操作) -- Column(二)

目录

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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值