当前位置:网站首页>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]|
+--------+--------+---+----------+---------+
没想明白是什么原因,暂时是以上述方法解决的。想明白了再来更新。
边栏推荐
猜你喜欢
随机推荐
【nohup】nohup命令的简单使用
VO、DTO、DO、POJO的区别和概念
在Zabbix5.4上使用ODBC监控Oracle数据库
CPU上下文切换详解思维导图
【云原生 · Kubernetes】Kubernetes基础环境搭建
IDEA连接mysql又报错!Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezone‘ prope
界面仅允许扫码枪录入禁止手工键盘输入
cnpm的安装与使用
ClickHouse删除数据之delete问题详解
UniApp 自定义条件编译详细使用流程
el-tree设置选中高亮焦点高亮、选中的节点加深背景,更改字体颜色等
Composer require 报错 Installation failed, reverting ./composer.json and ./composer.lock to their ...
nvm 卸载详细流程
一根网线完美解决IPTV+千兆网复用,还不来试试
PHP Composer常用命令积累
SQL——左连接(Left join)、右连接(Right join)、内连接(Inner join)
5 个开源的 Rust Web 开发框架,你选择哪个?
Command errored out with exit status 1类似问题解决方案
Migration of BOA Server
【EA Price strategy OC1】以实时价格为依据的EA,首月翻仓!】









