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

  在开发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)
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZeroXu0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值