当前位置:网站首页>pyspark @udf 循环使用变量问题
pyspark @udf 循环使用变量问题
2022-08-03 05:29:00 【WGS.】
问题描述
通过@udf的方式新增两列,udf应用每一列的广播变量是不一样的。但是几轮循环中,udf中接受的全局变量都是第一轮循环。伪代码如下:
from pyspark.sql.functions import udf
tlowdata = ss.createDataFrame([{
'suuid': 'DDD1', 'oaid': '00-01', 'y': 1},
{
'suuid': 'DOOD', 'oaid': '00-02', 'y': 0},
{
'suuid': '009-1234', 'oaid': 'default1', 'y': 0},
{
'suuid': 'DDD1', 'oaid': 'ttt', 'y': 0},
{
'suuid': 'www', 'oaid': 'fwao', 'y': 0},
{
'suuid': 'www', 'oaid': 'fff1', 'y': 0},])
tlowdata.show()
@udf
def tmp_udf(uid):
return str(tmplst.value)
cols = ['suuid', 'oaid']
lst = [[1, 2, 3], [4, 5, 6]]
global tmplst
for i in range(len(lst)):
tmplst = lst[i]
tmplst = sc.broadcast(tmplst)
print(tmplst.value)
tlowdata = tlowdata.withColumn(c[i] + '_flag', tmp_udf(fn.col(c[i])))
tmplst.unpersist()
tlowdata.show()
+--------+--------+---+
| oaid| suuid| y|
+--------+--------+---+
| 00-01| DDD1| 1|
| 00-02| DOOD| 0|
|default1|009-1234| 0|
| ttt| DDD1| 0|
| fwao| www| 0|
| fff1| www| 0|
+--------+--------+---+
[1, 2, 3]
[4, 5, 6]
+--------+--------+---+----------+---------+
| oaid| suuid| y|suuid_flag|oaid_flag|
+--------+--------+---+----------+---------+
| 00-01| DDD1| 1| [1, 2, 3]|[1, 2, 3]|
| 00-02| DOOD| 0| [1, 2, 3]|[1, 2, 3]|
|default1|009-1234| 0| [1, 2, 3]|[1, 2, 3]|
| ttt| DDD1| 0| [1, 2, 3]|[1, 2, 3]|
| fwao| www| 0| [1, 2, 3]|[1, 2, 3]|
| fff1| www| 0| [1, 2, 3]|[1, 2, 3]|
+--------+--------+---+----------+---------+
理论上,在新增oaid_flag
这一列的时候,应该是[4, 5, 6]
,但是无论循环几次,udf里接受的广播变量始终是[1, 2, 3]
。我都怀疑是spark2.4版本的问题了…
解决方案
放弃@udf,使用lambda udf
或者使用UserDefinedFunction
- lambda udf
# lambda udf
tmp_udf = fn.udf(lambda x: str(tmplst.value))
tlowdata = tlowdata.withColumn(c[i] + '_flag', tmp_udf(fn.col(c[i])))
- UserDefinedFunction
# UserDefinedFunction
from pyspark.sql.udf import UserDefinedFunction
def tmp_udf(uid):
return str(tmplst.value)
tlowdata = tlowdata.withColumn(c[i] + '_flag', UserDefinedFunction(lambda x: tmp_udf(x))(fn.col(c[i])))
+--------+--------+---+
| oaid| suuid| y|
+--------+--------+---+
| 00-01| DDD1| 1|
| 00-02| DOOD| 0|
|default1|009-1234| 0|
| ttt| DDD1| 0|
| fwao| www| 0|
| fff1| www| 0|
+--------+--------+---+
[1, 2, 3]
[4, 5, 6]
+--------+--------+---+----------+---------+
| oaid| suuid| y|suuid_flag|oaid_flag|
+--------+--------+---+----------+---------+
| 00-01| DDD1| 1| [1, 2, 3]|[4, 5, 6]|
| 00-02| DOOD| 0| [1, 2, 3]|[4, 5, 6]|
|default1|009-1234| 0| [1, 2, 3]|[4, 5, 6]|
| ttt| DDD1| 0| [1, 2, 3]|[4, 5, 6]|
| fwao| www| 0| [1, 2, 3]|[4, 5, 6]|
| fff1| www| 0| [1, 2, 3]|[4, 5, 6]|
+--------+--------+---+----------+---------+
没想明白是什么原因,暂时是以上述方法解决的。想明白了再来更新。
边栏推荐
猜你喜欢
随机推荐
AR路由器如何配置Portal认证(二层网络)
2021-06-20
MySQL的安装教程(嗷嗷详细,包教包会~)
【dllogger bug】AttributeError: module ‘dllogger‘ has no attribute ‘StdOutBackend‘
MySql的安装配置超详细教程与简单的建库建表方法
Redis哨兵模式+过期策略、淘汰策略、读写策略
Monitoring Oracle11gR2 in Zabbix6.0 of OracleLinux8.6
MySQL的安装(详细教程)
ES6 - 剩余参数,Array的扩展方法,String的扩展方法
UniApp scroll-view 事件不生效(@scroll、@scrolltolower、@scrolltoupper ...)
流式低代码编程,拖拽节点画流程图并运行
Command errored out with exit status 1类似问题解决方案
【设计指南】避免PCB板翘,合格的工程师都会这样设计!
【项目案例】配置小型网络WLAN基本业务示例
el-table实现列筛选功能,控制列的显示和隐藏(实现简单,效果满分)
Scala 高阶(八):集合内容汇总(下篇)
【multi_scale】多尺度训练——目标检测训练trick
Cesium加载离线地图和离线地形
MySQL 数据库基础知识(系统化一篇入门)
2021-06-14