【Saprk】Spark DataFrame 列的类型转换

应用场景

当需要把DataFrame中所有列的类型转换成另外一种类型,并且这个DataFrame中字段很多,一个一个地转换要写很多冗余代码的时候,就可以使用如下这两种转换方式。
 
 

方法一
scala> a.select(a.col("id"),a.col("username"),a.col("birthday").cast("string").as("bir")).show

方法二

代码如下

import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.functions.col
val df: DataFrame = ...
val columns: Array[String] = df.columns
val df2: DataFrame = columns.foldLeft(df){
    (currentDF, column) => currentDF.withColumn(column, col(column).cast("string"))
}
  • 变量columns代表df这DataFrame中的所有列,是一个String类型的数组。
  • foldLeft函数的作用就是,以df为初始值,从左向右遍历columns数组,并把df和columns中的每个元素作为参数传入foldLeft后面的函数中(也就是foldLeft后面的大括号中)。
  • withColumn中将每一列转换成String类型,并覆盖currentDF中同名字段的列。因为在withColumn函数中,如果存在同名的列,默认是进行替换的。
     
     
方法三

代码如下

import org.apache.spark.sql.{Column, DataFrame}
import org.apache.spark.sql.functions.col
val df: DataFrame = ...
val columns: Array[String] = df.columns
val arrayColumn: Array[Column] = columns.map(column => col(column).cast("string"))
val df2: DataFrame = df.select(arrayColumn :_*)

这种方法通过map函数将columns中的每一列转换成String类型,返回一个Column类型的数组。

  • :_*的作用就是,将arrayColumn数组中的每个元素作为参数传入select函数中,而不是将arrayColumn作为一个参数传入select中。
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值