当前位置:网站首页>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]|
+--------+--------+---+----------+---------+
没想明白是什么原因,暂时是以上述方法解决的。想明白了再来更新。
边栏推荐
- 2021新版idea过滤无用文件.idea .iml
- MySQL的安装(详细教程)
- MySQL 数据库基础知识(系统化一篇入门)
- 使用Powershell批量导入Task
- el-table获取读取数据表中某一行的数据属性
- 【YOLOv3 SPP 数据集准备】YOLOv3 SPP数据集准备代码理解
- TFS (Azure conversation) prohibit people checked out at the same time
- TFS(AzureDevOps)取消离职人员的签出项
- C # program with administrator rights to open by default
- Scala 基础 (三):运算符和流程控制
猜你喜欢
随机推荐
nvm 卸载详细流程
超全!9种PCB表面处理工艺大对比
计算机网络高频面试考点
MySQL的10种常用数据类型
ORM框架:Dapper的使用
UniApp 获取当前页面标题(navigationBarTitleText)
零代码工具拖拽流程图
PCB 多层板为什么都是偶数层?
RADIUS计费认证如何配置?这篇文章一步一步教你完成
Oracle常用命令-基本命令
502 bad gateway原因、解决方法
CISP-PTE真题演示
Oracle 数据库集群常用巡检命令
在Zabbix5.4上使用ODBC监控Oracle数据库
如何使用md5码验证文件的一致性
Prometheus监控容器、pod、邮件告警
MySQL的DATE_FORMAT()函数将Date转为字符串
IPV4地址详解
QT 连续生成指定范围内不重复的随机值
MySQL master-slave replication









