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

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

打印结果如下:

  1. +---+-------+---+
  2. |id |content|col|
  3. +---+-------+---+
  4. |1 |asf |0 |
  5. |2 |2143 |0 |
  6. |3 |rfds |0 |
  7. +---+-------+---+

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

  1. +---+-------+
  2. | id|content|
  3. +---+-------+
  4. | a| asf|
  5. | b| 2143|
  6. | b| rfds|
  7. +---+-------+

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

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

得到结果:

  1. +---+-------+---+
  2. |id |content|col|
  3. +---+-------+---+
  4. |a |asf |1 |
  5. |b |2143 |1 |
  6. |c |rfds |1 |
  7. +---+-------+---+

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

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

传入多个参数:

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

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. SignalR具有自签名SSL和自主机

    SignalR具有自签名SSL和自主机   在研究中试过我的运气,但到目前为止还没有快乐. 我想将SignalR javascript客户端连接到自签名的SignalR Windows服务绑定到自签名 ...

  2. day23.面向对象之继承

    1.什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 class A ...

  3. Archiver 3 for Mac(解压缩工具) ,想压缩解压慢一点就这么难!

    Archiver 3 for Mac是一款分割合并解压缩工具,简单实用且功能齐全,你只需简单的拖放文件就可以进行压缩,还可以设定解压密码,从而保护自己的隐私.如果文件很大你还可以切割文件.Archiv ...

  4. SpringBoot报错

    同时生成了两个mapper,删除一个就行了

  5. 初学笔记之:Java_Script的for循环事件绑定

    看JS,一直纠结于for循环事件绑定,我一直不理解,想找到一些解释,以下是个人研究一个下午后的一些见解,有不对的还望大神们指正,轻喷.在这里谢过啦. 首先,目的是做一个滑动切换图片的效果,上JS代码: ...

  6. 机器学习入门之sklearn介绍

    SKlearn简介 scikit-learn,又写作sklearn,是一个开源的基于python语言的机器学习工具包.它通过NumPy, SciPy和Matplotlib等python数值计算的库实现 ...

  7. Tag Helpers 的使用介绍

    什么是 Tag Helpers ? 在 Razor 文件中,Tag Helpers 能够让服务端代码参与创建和渲染 HTML 元素.例如,内置的ImageTagHelper能够在图像名称后面追加版本号 ...

  8. codeforces1152 div2

    比赛的链接 C gcd(a+k, b+k) == gcd(a+k, b-a) #include <bits/stdc++.h> using namespace std; const int ...

  9. 如何让Qt程序在运行时获取UAC权限

    在pro文件中加入以下语句: QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\' ...

  10. [linux]CentOS安装pre-built Nginx

    官方文档:https://nginx.org/en/linux_packages.html Nginx安装分为软件包安装和pre-built安装.这里使用的pre-built安装,不用自己编译. 设置 ...