spark 中给 dataframe 增加一列的方法一般使用 withColumn

// 新建一个dataFrame
val sparkconf = new SparkConf()
.setMaster("local")
.setAppName("test")
val spark = SparkSession.builder().config(sparkconf).getOrCreate()
val tempDataFrame = spark.createDataFrame(Seq(
(1, "asf"),
(2, "2143"),
(3, "rfds")
)).toDF("id", "content")
// 增加一列
val addColDataframe = tempDataFrame.withColumn("col", tempDataFrame("id")*0)
addColDataframe.show(10,false)

打印结果如下:

+---+-------+---+
|id |content|col|
+---+-------+---+
|1 |asf |0 |
|2 |2143 |0 |
|3 |rfds |0 |
+---+-------+---+

可以看到 withColumn 很依赖原来 dataFrame 的结构,但是假设没有 id 这一列,那么增加列的时候灵活度就降低了很多,假设原始 dataFrame 如下:

+---+-------+
| id|content|
+---+-------+
| a| asf|
| b| 2143|
| b| rfds|
+---+-------+

这样可以用 udf 写自定义函数进行增加列:

import org.apache.spark.sql.functions.udf
// 新建一个dataFrame
val sparkconf = new SparkConf()
.setMaster("local")
.setAppName("test")
val spark = SparkSession.builder().config(sparkconf).getOrCreate()
val tempDataFrame = spark.createDataFrame(Seq(
("a, "asf"),
("b, "2143"),
("c, "rfds")
)).toDF("id", "content")
// 自定义udf的函数
val code = (arg: String) => {
if (arg.getClass.getName == "java.lang.String") 1 else 0
} val addCol = udf(code)
// 增加一列
val addColDataframe = tempDataFrame.withColumn("col", addCol(tempDataFrame("id")))
addColDataframe.show(10, false)

得到结果:

+---+-------+---+
|id |content|col|
+---+-------+---+
|a |asf |1 |
|b |2143 |1 |
|c |rfds |1 |
+---+-------+---+

还可以写下更多的逻辑判断:

// 新建一个dataFrame
val sparkconf = new SparkConf()
.setMaster("local")
.setAppName("test")
val spark = SparkSession.builder().config(sparkconf).getOrCreate()
val tempDataFrame = spark.createDataFrame(Seq(
(1, "asf"),
(2, "2143"),
(3, "rfds")
)).toDF("id", "content") val code :(Int => String) = (arg: Int) => {if (arg < 2) "little" else "big"}
val addCol = udf(code)
val addColDataframe = tempDataFrame.withColumn("col", addCol(tempDataFrame("id")))
addColDataframe.show(10, false)
+---+-------+------+
|1 |asf |little|
|2 |2143 |big |
|3 |rfds |big |
+---+-------+------+

传入多个参数:

val sparkconf = new SparkConf()
.setMaster("local")
.setAppName("test")
val spark = SparkSession.builder().config(sparkconf).getOrCreate()
val tempDataFrame = spark.createDataFrame(Seq(
("1", "2"),
("2", "3"),
("3", "1")
)).toDF("content1", "content2") val code = (arg1: String, arg2: String) => {
Try(if (arg1.toInt > arg2.toInt) "arg1>arg2" else "arg1<=arg2").getOrElse("error")
}
val compareUdf = udf(code) val addColDataframe = tempDataFrame.withColumn("compare", compareUdf(tempDataFrame("content1"),tempDataFrame("content2")))
addColDataframe.show(10, false)
+--------+--------+----------+
|content1|content2|compare |
+--------+--------+----------+
|1 |2 |arg1<=arg2|
|2 |3 |arg1<=arg2|
|3 |1 |arg1>arg2 |
+--------+--------+----------+

spark使用udf给dataFrame新增列的更多相关文章

  1. Spark SQL DataFrame新增一列的四种方法

    方法一:利用createDataFrame方法,新增列的过程包含在构建rdd和schema中 方法二:利用withColumn方法,新增列的过程包含在udf函数中 方法三:利用SQL代码,新增列的过程 ...

  2. Spark获取DataFrame中列的方式--col,$,column,apply

    Spark获取DataFrame中列的方式--col,$,column,apply 1.官方说明 2.使用时涉及到的的包 3.Demo 原文作者:大葱拌豆腐 原文地址:Spark获取DataFrame ...

  3. spark编写UDF和UDAF

    UDF: 一.编写udf类,在其中定义udf函数 package spark._sql.UDF import org.apache.spark.sql.functions._ /** * AUTHOR ...

  4. spark计算两个DataFrame的差集、交集、合集

    spark 计算两个dataframe 的差集.交集.合集,只选择某一列来对比比较好.新建两个 dataframe : import org.apache.spark.{SparkConf, Spar ...

  5. Spark创建空的DataFrame

    前言 本文主要给出Spark创建空的DataFrame的代码示例,这里讲的空的DataFrame主要指有列名(可以自己随意指定),但是没有行的DataFrame,因为自己在开发过程中有这个需求,之前并 ...

  6. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十五)Spark编写UDF、UDAF、Agg函数

    Spark Sql提供了丰富的内置函数让开发者来使用,但实际开发业务场景可能很复杂,内置函数不能够满足业务需求,因此spark sql提供了可扩展的内置函数. UDF:是普通函数,输入一个或多个参数, ...

  7. Spark与Pandas中DataFrame对比

      Pandas Spark 工作方式 单机single machine tool,没有并行机制parallelism不支持Hadoop,处理大量数据有瓶颈 分布式并行计算框架,内建并行机制paral ...

  8. Spark与Pandas中DataFrame对比(详细)

      Pandas Spark 工作方式 单机single machine tool,没有并行机制parallelism不支持Hadoop,处理大量数据有瓶颈 分布式并行计算框架,内建并行机制paral ...

  9. (转)实现DataList的分页 新增列

    前几天在做网上商城,要展示商品信息(有图片,有文字),DataView虽然可以分页,但它的缺点是不能自定义显示格式.而DataList解决了它的缺点,但DataList本身却不能分页.很是头痛,于是在 ...

随机推荐

  1. 通过创建制定版本react-native项目解决“Unable to resolve module `AccessibilityInfo` ”的问题

    react-native init MyApp --version 0.55.4 注:不能将--version简写成-v

  2. 如何用js去判断当前是否在微信中打开的链接页面

    function is_weixin() { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) = ...

  3. 微软开源大规模数据处理项目 Data Accelerator

    微软开源了一个原为内部使用的大规模数据处理项目 Data Accelerator.自 2017 年开发以来,该项目已经大规模应用在各种微软产品工作管道上. 据微软官方开源博客介绍,Data Accel ...

  4. NRF51822模块无法识别问题解决办法

    我知道没图是没人看的,所以随便瞎截图了几张. 对于很多新手朋友们,或许可能还不是很了解jtag相关的一些调试所需的必须电路,就像很多人不喜欢用stm32的硬件i2c,而是喜欢软件io模拟,就算是使用了 ...

  5. 微服务框架——SpringCloud(四)

    1.Spring Cloud Config 分布式配置 a.Config服务器 ①新建springboot项目,依赖选择Config Server ②pom文件关键依赖 <parent> ...

  6. java位移运算符3 转

    https://www.cnblogs.com/winsker/p/6728672.html 移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数. 理解java移位运算符 运算 ...

  7. 微信小程序视频学习笔记

    [清华大学]学做小程序 https://www.bilibili.com/video/av21987398 2.2创建项目和文件结构 小程序包含一个描述整体程序的app和多个描述各自页面的page 配 ...

  8. BFS —— 信息学一本通(1451:棋盘游戏)

    题目描述 在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的.移动棋子的规则是交换相邻两个棋子.现在给出一个初始棋盘和一个最终棋盘,要求你找出一个最短的移动序 ...

  9. [POJ2259]Team Queue (队列,模拟)

    2559是栈,2259是队列,真的是巧啊 题意 模拟队列 思路 水题 代码 因为太水,不想打,发博客只是为了与2559照应,于是附上lyd的std #include <queue> #in ...

  10. CF1097G Vladislav and a Great Legend

    传送门 题目大意 一棵$n$个点的树,一个点集$S$的权值定义为把这个点击连成一个联通块的最少边数,求: $$ans=\sum_{S\in U}f(S)^k$$ 题解 这题跟gdoi那道题差不多 先把 ...