架构智慧
架构智慧
大数据主流架构经验交流分享
  1. 首页
  2. 实时计算
  3. 正文

在dataframe中添加新字段column的三种方法

2020年08月04日 782点热度 0人点赞 0条评论

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

 
}
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: dataframe spark
最后更新:2020年08月04日

hivefans

保持饥渴的专注,追求最佳的品质

点赞
下一篇 >

文章评论

取消回复
分类目录
  • 大数据浪潮 (2)
  • 实时数仓 (1)
  • 实时计算 (6)
  • 离线计算 (4)
2020年8月
一 二 三 四 五 六 日
 12
3456789
10111213141516
17181920212223
24252627282930
31  
« 7月   9月 »
文章归档
  • 2021年7月 (2)
  • 2020年9月 (4)
  • 2020年8月 (4)
  • 2020年7月 (2)
  • 2020年6月 (1)
标签聚合
dataframe elasticsearch kafka 实时计算 hive flink spark 窗口函数
友情链接
  • 大数据导航
  • 网站地图
  • 隐私政策

COPYRIGHT © 2020 架构智慧. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

京ICP备19056408号