Spark系列 —— 一行代碼轉化DataFrame所有列的類型

應用場景

當需要把DataFrame中所有列的類型轉換成另外一種類型,並且這個DataFrame中字段很多,一個一個地轉換要寫很多冗餘代碼的時候,就可以使用如下這兩種轉換方式。
 
 

方法一

代碼如下

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中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章