在spark处理数据的项目开发过程中,经常会遇到清洗、转换数据的需求,转换数据就要在原来dataframe中增加新的字段,下面总结了3个常用增加字段的方法

首先创建一个dataframe数据实例
import spark.sqlContext.implicits._
val data = Seq(("111",50000),("222",60000),("333",40000))
val df = data.toDF("EmpId","Salary")
df.show(false)
生成数据
+-----+------+
|EmpId|Salary|
+-----+------+
|111 |50000 |
|222 |60000 |
|333 |40000 |
+-----+------+
方法1 使用withColumn()增加列
withColumn()用于在DataFrame上添加新列或更新现有列,在这里仅说明如何使用现有列添加新列。 withColumn()函数带有两个参数,第一个参数是新列的名称,第二个参数是Column类型中的列的值。
df.withColumn("newsalary",col("salary") -10000)
.show(false)
我们增加了一个新的字段 newsalary,字段值为 salary -10000
+-----+------+------------+
|EmpId|Salary|CopiedColumn|
+-----+------+------------+
|111 |50000 | 40000 |
|222 |60000 | 50000 |
|333 |40000 | 30000 |
+-----+------+------------+
方法2 使用select方法
df.select($"EmpId",$"Salary", ($"salary" -10000).as("newsalary") )
.show(false)
这种方法和withcolumn实现结果一样
方法3 使用lit() 增加常量字段
val df2 = df.select(col("EmpId"),col("Salary"),lit("1").as("lit_value1"))
df2.show()
+-----+------+----------+
|EmpId|Salary|lit_value1|
+-----+------+----------+
| 111| 50000| 1|
| 222| 60000| 1|
| 333| 40000| 1|
+-----+------+----------+
根据字段的条件增加常量
val df3 = df2.withColumn("lit_value2",
when(col("Salary") >=40000 && col("Salary") <= 50000,
lit("100").cast(IntegerType))
.otherwise(lit("200").cast(IntegerType))
)
df3.show()
全部测试源码
package com.examples
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.{col, lit, typedLit, when}
import org.apache.spark.sql.types.IntegerType
object AddColumn extends App {
val spark = SparkSession.builder()
.appName("SparkByExamples.com")
.master("local")
.getOrCreate()
import spark.sqlContext.implicits._
val data = Seq(("111",50000),("222",60000),("333",40000))
val df = data.toDF("EmpId","Salary")
df.show(false)
//Derive a new column from existing
df.withColumn("newsalary",df("salary")-10000)
.show(false)
//Using select
df.select($"EmpId",$"Salary", ($"salary"-10000).as("newsalary") )
.show(false)
//Adding a literal
val df2 = df.select(col("EmpId"),col("Salary"),lit("1").as("lit_value1"))
df2.show()
val df3 = df2.withColumn("lit_value2",
when(col("Salary") >=40000 && col("Salary") <= 50000, lit("100").cast(IntegerType))
.otherwise(lit("200").cast(IntegerType))
)
df3.show(false)
}
文章评论