假如有1亿行数据

方法1 spark udf解密

from pyspark.sql import SparkSession
import pyspark.sql.functions as F
from pyDes import *
import binasciispark=SparkSession.builder.getOrCreate()def dec_fun(text):key = triple_des(b"HHHHHHHHHHHHHHHHHHHHHHHH", CBC, b"XXXXXXXX", padmode=PAD_PKCS5)if not text:return Nonereturn k.decrypt(base64.b64decode(text)).decode('utf-8')
spark.udf.register("dec_fun",dec_fun)df.withColumn("dec_col",F.expr("dec_fun(en_col)")).write.mode("overwrite").save("OOOO")
  • 密钥初始化1亿次
  • 每条数据触发一次JVM → Python进程的数据传输
  • 每次传输需序列化/反序列化数据(性能杀手)
  • 高频进程间通信(IPC)产生巨大开销

方法2 repartition+mapPartition

为了提高效率,我们可以利用mapPartitions在每个分区内部只初始化一次解密对象,避免重复初始化。

def dec_fun(text):if not text:return Noneelse:result = base64.b64decode(text)k = triple_des(b"HHHHHHHHHHHHHHHHHHHHHHHH", CBC, "XXXXXXXX", pad=None, padmode=PAD_PKCS5)d = k.decrypt(result)return d.decode("utf-8")spark.udf.register("dec_fun", dec_fun)# 分区解密
def rdd_decrypt(partitionData):for row in partitionData:try:yield [dec_fun(row.zj_no)]except:passdf.select("en_col").repartition(30).rdd.mapPartitions(rdd_decrypt).toDF(["dec_col"]).write.mode("overwrite").save("OOOO")

密钥初始化依然是1亿次,这个代码写的不好,应该每个分区初始化1次而不是每行。但相对方法1依然有答复性能提升,

  • mapPartitions
    • 分区级批量传输:每个分区一次性从JVM发送到Python进程(例如1个分区10万条数据,仅1次传输)
    • 几个分区就调用几次函数(对比1亿次的UDF调用)

方法3 repartition+mapPartition+分区1次初始化

def dec_fun(partitionData):k = triple_des(b"HHHHHHHHHHHHHHHHHHHHHHHH", CBC, "XXXXXXXX", pad=None, padmode=PAD_PKCS5)for row in partitionData:try:if row.zj_no:result = base64.b64decode(row.zj_no)d = k.decrypt(result)yield [d.decode("utf-8")]else:continueexcept:pass# 如果要保留原始一大堆列,更麻烦
df.select("en_col").repartition(20).rdd.mapPartitions(dec_fun).toDF(["dec_col"]).write.mode("overwrite").save("OOOO")
  • 密钥初始化数=分区数
  • 通过repartition(20)合理调整分区
  • 利用RDD底层优化

方法4 scalar pandas_udf

import pyspark.sql.functions as F
spark.conf.set("spark.sql.execution.arrow.pyspark.enabled", "true") @F.pandas_udf("string")
def dec_fun(series: pd.Series) -> pd.Series:k = triple_des(b"HHHHHHHHHHHHHHHHHHHHHHHH", CBC, "XXXXXXXX", pad=None, padmode=PAD_PKCS5)def _decrypt(text):try:if text:result = base64.b64decode(text)d = k.decrypt(result)return d.decode("utf-8")except:passreturn series.apply(_decrypt)df.select("en_col").repartition(20).withColumn("dec_col",F.expr("dec_fun(en_col)")).write.mode("overwrite").save("OOOO")

🌟 优势

  • 利用Apache Arrow高效内存传输
  • Pandas向量化操作潜力
  • 与DataFrame API无缝集成

⚠️ 局限

  • 密钥初始化数=batch数
  • 大分区内存压力大

方法5 迭代器型pandas_udf

我们可以使用迭代器类型的Pandas UDF,在每次处理一个迭代器(一个迭代器对应一个batch)时只初始化一次密钥对象:

import pyspark.sql.functions as F
spark.conf.set("spark.sql.execution.arrow.pyspark.enabled", "true") @F.pandas_udf("string")
def dec_fun(series_iter: Iterator[pd.Series]) -> Iterator[pd.Series]:k = triple_des(b"HHHHHHHHHHHHHHHHHHHHHHHH", CBC, "XXXXXXXX", pad=None, padmode=PAD_PKCS5)def _decrypt(text):try:if text:result = base64.b64decode(text)d = k.decrypt(result)return d.decode("utf-8")except:passfor series in series_iter:de_series = series.apply(_decrypt)yield de_seriesdf.select("en_col").repartition(20).withColumn("dec_col",F.expr("dec_fun(en_col)")).write.mode("overwrite").save("OOOO")
  • 密钥初始化数=分区数
  • 内存友好的批处理流
  • 向量化
  • Arrow优化零拷贝传输
  • 完美平衡初始化开销和并行效率

综合

方法5>(方法4,方法3)>方法2>方法1

方法4,方法3这两者,我也倾向方法4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913254.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913254.shtml
英文地址,请注明出处:http://en.pswp.cn/news/913254.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云Flexus+DeepSeek征文|华为云ECS与CCE:从介绍到架构部署·仅需要此文足矣

前引:当今的企业面临着前所未有的技术挑战:如何构建既安全又高效、既灵活又可靠的云服务架构?如何有效整合人工智能技术,打造智能化的运维和服务体系?这些问题的答案,正在悄然改变着企业级IT基础设施的生态…

DAY 50 预训练模型+CBAM模块

浙大疏锦行https://blog.csdn.net/weixin_45655710 知识点回顾: resnet结构解析CBAM放置位置的思考针对预训练模型的训练策略 差异化学习率三阶段微调 作业: 好好理解下resnet18的模型结构尝试对vgg16cbam进行微调策略 ResNet-18 结构核心思想 可以将R…

docker连接mysql

查看在运行的容器:docker ps -s 进入容器:docker exec -it 容器号或名 /bin/bash,如:docker exec -it c04c438ff177 /bin/bash 或docker exec -it mysql /bin/bash。 3. 登录mysql:mysql -uroot -p123456

javaweb第182节Linux概述~ 虚拟机连接不上FinalShell

问题描述 虚拟机无法连接到finalshell 报错 session.connect:java.net.socketexception:connection reset 或者 connection is closed by foreign host 解决 我经过一系列的排查,花费了一天的时间后,发现,只是因为,我将连接…

高压电缆护层安全的智能防线:TLKS-PLGD 监控设备深度解析

在现代电力系统庞大复杂的网络中,高压电缆护层是守护电力传输的 "隐形铠甲",其安全直接影响电网稳定。传统监测手段响应慢、精度低,难以满足安全运维需求。TLKS-PLGD 高压电缆护层环流监控设备应运而生,提供智能化解决方…

Element-Plus Cascader 级联选择器获取节点名称和value值方法

html 部分 <template><el-cascaderref"selectAeraRef":options"areas":disabled"disabled":props"optionProps"v-model"selectedOptions"filterablechange"handleChange"><template #default"…

STM32中实现shell控制台(命令解析实现)

文章目录一、核心设计思想二、命令系统实现详解&#xff08;含完整注释&#xff09;1. 示例命令函数实现2. 初始化命令系统3. 命令注册函数4. 命令查找函数5. 命令执行函数三、命令结构体&#xff08;cmd\_t&#xff09;四、运行效果示例五、小结在嵌入式系统的命令行控制台&am…

基于matlab的二连杆机械臂PD控制的仿真

基于matlab的二连杆机械臂PD控制的仿真。。。 chap3_5input.m , 1206 d2plant1.m , 1364 hs_err_pid2808.log , 15398 hs_err_pid4008.log , 15494 lx_plot.m , 885 PD_Control.mdl , 35066 tiaojie.m , 737 chap2_1ctrl.asv , 988 chap2_1ctrl.m , 905

TCP、HTTP/1.1 和HTTP/2 协议

TCP、HTTP/1.1 和 HTTP/2 是互联网通信中的核心协议&#xff0c;它们在网络分层中处于不同层级&#xff0c;各有特点且逐步演进。以下是它们的详细对比和关键特性&#xff1a;1. TCP&#xff08;传输控制协议&#xff09; 层级&#xff1a;传输层&#xff08;OSI第4层&#xff…

Java+Vue开发的进销存ERP系统,集采购、销售、库存管理,助力企业数字化运营

前言&#xff1a;在当今竞争激烈的商业环境中&#xff0c;企业对于高效管理商品流通、采购、销售、库存以及财务结算等核心业务流程的需求日益迫切。进销存ERP系统作为一种集成化的企业管理解决方案&#xff0c;能够整合企业资源&#xff0c;实现信息的实时共享与协同运作&…

【趣谈】Android多用户导致的UserID、UID、shareUserId、UserHandle术语混乱讨论

【趣谈】Android多用户导致的UserID、UID、shareUserId、UserHandle术语混乱讨论 备注一、概述二、概念对比1.UID2.shareUserId3.UserHandle4.UserID 三、结论 备注 2025/07/02 星期三 在与Android打交道时总遇到UserID、UID、shareUserId、UserHandle这些术语&#xff0c;但是…

P1424 小鱼的航程(改进版)

题目描述有一只小鱼&#xff0c;它平日每天游泳 250 公里&#xff0c;周末休息&#xff08;实行双休日)&#xff0c;假设从周 x 开始算起&#xff0c;过了 n 天以后&#xff0c;小鱼一共累计游泳了多少公里呢&#xff1f;输入格式输入两个正整数 x,n&#xff0c;表示从周 x 算起…

<二>Sping-AI alibaba 入门-记忆聊天及持久化

请看文档&#xff0c;流程不再赘述&#xff1a;官网及其示例 简易聊天 环境变量 引入Spring AI Alibaba 记忆对话还需要我们有数据库进行存储&#xff0c;mysql&#xff1a;mysql-connector-java <?xml version"1.0" encoding"UTF-8"?> <pr…

【机器学习深度学习】模型参数量、微调效率和硬件资源的平衡点

目录 一、核心矛盾是什么&#xff1f; 二、微调本质&#xff1a;不是全调&#xff0c;是“挑着调” 三、如何平衡&#xff1f; 3.1 核心策略 3.2 参数量 vs 微调难度 四、主流轻量微调方案盘点 4.1 冻结部分参数 4.2 LoRA&#xff08;低秩微调&#xff09; 4.3 量化训…

【V13.0 - 战略篇】从“完播率”到“价值网络”:训练能预测商业潜力的AI矩阵

在上一篇 《超越“平均分”&#xff1a;用多目标预测捕捉观众的“心跳曲线”》 中&#xff0c;我们成功地让AI学会了预测观众留存曲线&#xff0c;它的诊断能力已经深入到了视频的“过程”层面&#xff0c;能精确地指出观众是在哪个瞬间失去耐心。 我的AI现在像一个顶级的‘心…

java微服务(Springboot篇)——————IDEA搭建第一个Springboot入门项目

在正文开始之前我们先来解决一些概念性的问题 &#x1f355;&#x1f355;&#x1f355; 问题1&#xff1a;Spring&#xff0c;Spring MVC&#xff0c;Spring Boot和Spring Cloud之间的区别与联系&#xff1f; &#x1f36c;&#x1f36c;&#x1f36c;&#xff08;1&#xff0…

服务器间接口安全问题的全面分析

一、服务器接口安全核心威胁 文章目录**一、服务器接口安全核心威胁**![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6f54698b9a22439892f0c213bc0fd1f4.png)**二、六大安全方案深度对比****1. IP白名单机制****2. 双向TLS认证(mTLS)****3. JWT签名认证****4. OAuth…

vs code关闭函数形参提示

问题&#xff1a;函数内出现灰色的形参提示 需求/矛盾&#xff1a; 这个提示对老牛来说可能是一种干扰&#xff0c;比如不好对齐控制一行代码的长度&#xff0c;或者容易看走眼&#xff0c;造成眼花缭乱的体验。 关闭方法&#xff1a; 进入设置&#xff0c;输入inlay Hints&…

ESXi 8.0安装

使用群晖&#xff0c;突然nvme固态坏了 新nvme固态&#xff0c;先在PC上格式化下&#xff0c;不然可能N100可能不认 启动&#xff0c;等待很长时间 回车 F11 输入密码&#xff0c;字母小写字母大写数字 拔掉U盘&#xff0c;回车重启 网络配置 按F2&#xff0c; 输入密码&…

【git学习】第2课:查看历史与版本回退

好的&#xff0c;我们进入 第2课&#xff1a;版本查看与回退机制&#xff0c;本课你将学会如何查看提交历史、对比更改&#xff0c;并掌握多种回退版本的方法。&#x1f4d8; 第2课&#xff1a;查看历史与版本回退&#x1f3af; 本课目标熟练查看 Git 提交记录掌握差异查看、版…