spark使用withColumn在dataFrame中增加一列、多列,配合cache函数一起使用

2023-10-26

  在开发spark应用过程中需要往hive表中造测试数据,同时造多列数据,部分列之间存在逻辑计算关系,一般使用dataframe的函数.withColumn(“col_name”,conditions),此时conditions可以直接是类似于 col(“column_a”) * col(“column_b”) 这样的计算条件,也可以是udf函数。
例如: 如果我们需要使用table_1关联table_2,得到col_a,且需要新增三列col_b,col_c和col_d,计算条件如下:


col_b = (randomDouble() * 1.5).formatted("%.2f").toDouble,
col_c = col_a * col_b,
col_d = col_c / (col_a - col_b)

  从计算条件得知,先用spark连接hive库,读取table_1和table_2生成对应的dataframe,得到col_a;
  col_b可以由自定义函数实现,且不依赖其他列;
  而col_c和col_d均依赖其他列的数据,这里就要注意,需要在col_b计算完之后,加上cache缓存数据【cache的功能是缓存:针对频繁使用的数据/数据处理,cache将 RDD 元素从磁盘缓存到内存,便于下次读取】否则col_b的计算结果还没有被缓存到内存中,col_c也同时在计算且利用到了col_b的值,导致col_c数据混乱;
  同理,新增col_d时候,也需要将col_c的结果缓存起来。

(开发环境spark+hive+scala)

//自定义udf函数不带参数
val col_udf = udf(() => {
	(randomDouble() * 1.5).formatted("%.2f").toDouble
})

//自定义udf函数带参数
val col_udf_withParams= udf((col_a:Int,col_b:Double,col_c:Double) => {
	col_c / (col_a - col_b)
})

result_df = df_table_1.
join(df_table_2("t2_col_a"),col("t1_col_a")===col("t2_col_a"),"left_outer")
.withColumnRenamed("t1_col_a","col_a") // 将t1_col_a重命名成col_a
//不用cache,因为col_b是独立计算的随机数
.withColumnRenamed("col_b",col_udf()) // col_b是随机数
//注意:在计算完col_b之后这地方必须增加缓存,否则col_c的计算结果并不等于col_a * col_b
.cache() 
.withColumn("col_c",col("col_a") * col("col_b"))
.cache() 
.withColumn("col_d",col_udf_withParams(col("col_a"),col("col_b"),col("col_c")))
.select(
 "col_a",
 "col_b",
 "col_c",
 "col_d"
).show(10)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spark使用withColumn在dataFrame中增加一列、多列,配合cache函数一起使用 的相关文章

  • 如何在存储过程中使用名称求和和分组?

    我想对钱列求和 但我想要状态中的组名称和代码 这是存储过程代码 Sql Server 2008 SELECT um upmoney as money um pId as code um FName as name up status as
  • SQL FORMAT 函数错误

    这个SQL select FORMAT lNum from rpt myView 产生以下错误 参数数据类型 varchar 对于格式的参数 1 无效 功能 lNum is a varchar 10 运行 SQL Server 2012 v
  • MySQL 中有“connect by”替代方案吗?

    如果我使用 Oracle 有connect by可用于创建分层查询的关键字 目前我正在一个项目中使用MySQL 我想知道是否有替代方案connect by在 MySQL 中 我尝试过谷歌 但到目前为止还没有结果 我想要实现的是通过一个查询从
  • 使用sqlbulkcopy之前如何创建表

    我有一个 DBF 文件 我正在尝试导入该文件 然后将其写入 SQL 表 我遇到的问题是 如果我使用 SqlBulkCopy 它需要我提前创建表 但在我的场景中这是不可能的 因为 dbf 文件不断变化 到目前为止 这是我的代码 public
  • SQL 中的代码重用和模块化

    代码重用和模块化对于 SQL 存储过程编程来说是一个好主意吗 如果是这样 将这些功能添加到 SQL 存储过程代码库的最佳方法是什么 我通常为常见且重复的任务创建标量值函数 我发现它不仅可以简化与现有程序类似的新程序的开发 而且还有助于错误跟
  • Scala 条件列表构造

    我正在使用 Scala 2 9 2 并且想根据某些条件构建一个列表 考虑以下情况 其中 cond 是采用谓词 p 和类型 T 的值 在本例中为 t3 的某个函数 t1 t2 cond p t3 t4 我想要的行为如下 如果 p 为真 则应给
  • Hive:在查询中将 array 转换为 array

    我有两张桌子 create table a 1 array
  • Scala 中的 Apply 和 lambda

    我有下面的代码 scala gt val builder new StringBuilder foo bar baz builder StringBuilder foo bar baz scala gt 0 until 5 foreach
  • 日常 MySQL(部分和过滤)复制的最佳实践?

    我有一个相当大的数据库 有超过 40 个表 我只需要复制几个表 5 并且每个表也被过滤 我正在寻找一些复制这些数据的最佳实践 每天就足够了 我可以只选择几个表并为每个表包含一些 WHERE 子句 我正在考虑为每个表启动 mysqldump
  • 如何从连接字符串中提取数据库名称,而不考虑 RDBMS?

    我正在研究一个不知道正在使用的 RDBMS 的课程 当然 应用程序的其余部分都清楚这一点 连接字符串是此类的输入 我需要数据库名称 无论 RDBMS 如何 如何从连接字符串中提取数据库名称 我读到以下问题 如何使用 SqlConnectio
  • 带可变参数的 Spark UDF

    如文档中所示 列出最多 22 个参数是唯一的选择吗 https spark apache org docs 1 5 0 api scala index html org apache spark sql UDFRegistration ht
  • PostgreSQL & regexp_split_to_array + 取消嵌套

    我有这样的绳子 测试1 纽约 X 测试 2 芝加哥 Y 测试 3 宾夕法尼亚州哈里斯堡 Z 我需要的结果是 Column1 Column 2 Column3 Test 1 new york X Test 2 chicago Y Test 3
  • MySQL解释更新

    作为我大学复习的一部分 我试图回答以下问题 至少在表的一个属性上创建索引 employees 数据库 您可以在其中使用 MySQL EXPLAIN 工具 清楚地显示好处 在条款或检索方面 和负面 在 更新条款 创建相关索引的信息 对于第一部
  • Scala:将整个列表的 Either 与每个元素的 Either 组合

    我有一个 Either 列表 它代表错误 type ErrorType List String type FailFast A Either ErrorType A import cats syntax either val l List
  • SQL Like 带有子查询

    我怎样才能做到这一点 SELECT FROM item WHERE item name LIKE SELECT equipment type FROM equipment type GROUP BY equipment type 内部子查询
  • 了解涉及 3 个或更多表时 JOIN 的工作原理。 [SQL]

    我想知道是否有人可以帮助我提高对 SQL 中 JOIN 的理解 如果它对问题很重要 我会特别考虑 MS SQL Server 取 3 个表 A B A 通过某些 A AId 与 B 相关 和 C B 通过某些 B BId 与 C 相关 如果
  • 过滤项目来源

    通过此代码 我设置了数据网格的 ItemsSource 不过 我有更多的 wpf 控件来过滤数据网格 例如从时间范围过滤数据网格 我可以为此编写一个新查询 但这似乎没有必要 因为数据已经可用 我只需要过滤它 最好的方法是什么 我能得到的任何
  • 如何将此本机 SQL 查询转换为 HQL

    所以我有这个很长的复杂的 Native SQLQuery string hql SELECT FROM SELECT a rownum r FROM select f2 filmid f2 realisateurid f2 titre f2
  • SQL Server 标识列值从 0 而不是 1 开始

    我遇到了一个奇怪的情况 数据库中的某些表的 ID 从 0 开始 即使 TABLE CREATE 的 IDENTITY 1 1 也是如此 对于某些表来说是这样 但对于其他表则不然 它一直有效到今天 我尝试过重置身份列 DBCC CHECKID
  • Postgresql:SERIAL 在约束 INSERT 失败时递增

    有一个像这样的简单表结构 CREATE TABLE test id INT PRIMARY KEY sid SERIAL 我注意到如果我尝试插入一行但它未通过约束测试 即主键约束 SERIAL计数器无论如何都会增加 所以下一次成功插入 si

随机推荐

  • 5g信号云端服务器,5G基站已有11W 国内云游戏迎来春天

    目前有报道称全国已经开通了11 3W个5G网络基站 已有87万户5G签约用户 这意味着在全国范围 有关需要网络的IT产品和生活产品都将迎来春天 其中包括网络连接使用的云游戏 进入到2019年 国内5G商用全面启动 华为 小米 OPPO等手机
  • QString : 类型转换,不留神就留坑?

    QString作为Qt中内置的数据类型 功能强大且使用方便 绝对是在Qt开发过程中出场率最高的数据类型 本篇我们只重点探讨下QString转换成其他数据类型的注意事项 short toShort bool ok nullptr int ba
  • gg修改器修改数值没有用怎么办_gg修改器修改游戏数值教程_gg修改器怎么修改数值_3DM手游...

    GG修改器是很多玩家都在用的一款游戏辅助工具 使用这款软件 能够对多种游戏的数值进行随意的修改 调整成你所需要的数值 让你玩游戏玩的更爽 今天3DM小编为大家带来的是GG修改器修改游戏数值的教程 有需要的小伙伴们可以来一起了解下 GG修改器
  • Android事件分发机制及设计思路,熬了整整30天

    前言 想要成为一名优秀的Android开发 你需要一份完备的知识体系 在这里 让我们一起成长为自己所想的那样 此篇文章是初中高级工程师学习文章 知识体系较为完整 有如下特点 1 知识结构全面 2 跟随当下技术潮流实时更新 3 可用于面试 学
  • mybatis

    mybatis 起步1 之前的mybatis写法 起步2 接口式编程写法 mybatis的配置 properties settings mapUnderscoreToCamelCase typeAliases mappers 这里项目结构发
  • (三)系统与架构级低功耗设计

    前面讲解了使用EDA工具 主要是power compiler 进行功耗分析的流程 这里我们将介绍在数字IC中进行低功耗设计的方法 同时也结合EDA工具 主要是Design Compiler 如何实现 我们的讲解的低功耗设计主要是自顶向下的设
  • 笔录Flutter(十一) FloatingActionButton

    Flutter练习Demo FloatingActionButton也是经常用的 除了常见的悬浮在右下角的一个按钮 还可以利用floatingActionButtonLocation属性 控制位置的展示 floatingActionButt
  • Python:使用爬虫抓取网页中的视频并下载(完整源码)

    Python 使用爬虫抓取网页中的视频并下载 完整源码 在今天的程序开发世界中 网站是不可或缺的一部分 人们使用网站来获取有用的信息 购买商品和娱乐自己 这些网站的内容通常包含了各种类型的文件 其中最常见的就是视频 对于有经验的程序开发者来
  • 黑马JVM总结(八)

    1 StringTable面试题 1 8 1 6时 2 StringTable的位置 jvm1 6时StringTable是常量池的一部分 它随着常量池存储在永久代当中 在1 7 1 8中从永久代变成了堆中 为什么做这个更改呢 因为永久代的
  • 关于javascript md5 函数介绍

    转自 微点阅读 https www weidianyuedu com var hexcase 1 var b64pad var chrsz 8 var mode 16 模式选择 16为16位的加密 32 为32位的加密 function p
  • Eureka的常用配置讲解

    1 关闭自我保护 保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景时 一旦进入保护模式 Eureka Server将会尝试保护其服务的注册表中的信息 不在删除服务注册表中的数据 当网络故障恢复后 Eureka Se
  • 外包四年太差劲,才幡然醒悟要跳槽

    前几天有个读者过来说 程序猿 外包干了四年太差劲了 感觉和外界差距有点大 现在被动醒悟 希望你能帮我制定一下学习路线 如果不是女朋友和我提分手 我估计现在还没醒悟 大专生 18年通过校招进入湖南某软件公司 干了3年多的CRUD 今年年初 感
  • VS--屏蔽编译warning警告设置

    VS 屏蔽编译warning警告设置 在 项目 gt 属性 gt 配置属性 gt C C gt 高级 的 禁用特定警告 中添加相应的警告编号 如4819
  • 机器学习-前期知识储备

    1 什么是机器学习 机器学习 利用数学模型来理解数据 发现数据中的规律 用作数据的分析和预测 数据通常由一组向量组成 这组向量中的每个向量都是一个样本 我们用 x i x i xi 来表示一个样本 其中 i
  • Spark Streaming实战对论坛网站动态行为pv,uv,注册人数,跳出率的多维度分析,实时统计每天pv,uv的sparkStreaming结合redis结果存入mysql供前端展示

    论坛数据运行代码自动生成 该生成的数据会作为Producer的方式发送给Kafka 然后SparkStreaming程序会从Kafka中在线Pull到论坛或者网站的用户在线行为信息 进而进行多维度的在线分析 数据格式如下 date 日期 格
  • 判断自己的mac是macOS x64 、 macOS ARM64

    在学习微信小程序时 需要安装微信开发者工具 那么mac用户怎么知道自己mac版本是macOS x64 还是macOS ARM64 解决方法如下 在终端输入uname a 具体操作 一 打开访达 二 应用程序 gt 实用工具 gt 终端 三
  • 微信小程序蓝牙扫描搜不到信号

    调试蓝牙连接的时候 我的手机突然搜不到蓝牙信号了 但别人手机可以 看了网上的做法 无非是要打开系统蓝牙权限 系统定位权限 小程序蓝牙权限 确认都打开之后仍旧不行 最后发现是一个微信应用权限被关掉了 打开以后能正常搜索
  • 【Microsoft Remote Desktop For Mac在Mac上远程Windows桌面】

    Microsoft Remote Desktop For Mac在Mac上远程Windows桌面 Microsoft Remote Desktop For Mac 下载链接 发牢骚 版本说明 所有下载均为beta版 下载网站截图 Micro
  • python xml读写

    1 xml例子
  • spark使用withColumn在dataFrame中增加一列、多列,配合cache函数一起使用

    在开发spark应用过程中需要往hive表中造测试数据 同时造多列数据 部分列之间存在逻辑计算关系 一般使用dataframe的函数 withColumn col name conditions 此时conditions可以直接是类似于 c