当前位置: 首页 > news >正文

【PySpark】 如何在 Windows 成功使用 `saveAsTextFile()` 全流程教程 ✅

📘 PySpark 数据输出终极指南:如何在 Windows 成功使用saveAsTextFile()全流程教程

本文目标

你是否遇到过如下报错?

java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z Caused by: java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z 由于找不到 MSVCR120.dll,无法继续执行代码。

今天,我们将彻底解决这个问题,并让你:
成功运行rdd.saveAsTextFile("D:/output1")
在 Windows 环境中使用 Spark 原生输出方式
构建生产级 PySpark 流程(数据输入 → 计算 → 输出)


一、为什么saveAsTextFile()会崩溃?

根本原因(深度解析):

MSVCR120.dllMicrosoft Visual C++ 2013 Redistributable Runtime的一部分。

当你执行:

rdd.saveAsTextFile("D:/output1")

Spark 会尝试使用 Hadoop 的原生本地库(native IO)来写文件,其依赖如下链:

Spark → Hadoop → nativeio.dll → NativeIO$Windows.access0() → MSVCR120.dll

当系统找不到MSVCR120.dll,就会抛出UnsatisfiedLinkError

即使你不用saveAsTextFile(),只要在PATH中加入了E:\APP\hadoop-3.4.2\bin,Spark 仍会尝试加载 native IO!


二、解决方案:三步闭环法(配置 + 权限 + 修复)

最终目标:让你的rdd.saveAsTextFile("D:/output1")成功运行


第一步:配置PATH+PYSPARK_PYTHON

importos# 1. 指定 Python 解释器路径(必须!)os.environ["PYSPARK_PYTHON"]="D:\\APP\\Anaconda\\envs\\spark_env\\python.exe"# 2. 设置超时,防止 task 中断os.environ['PYSPARK_TIMEOUT']='600'os.environ['PYSPARK_DRIVER_TIMEOUT']='600'# 3. 关键:添加 Hadoop bin 到 PATHos.environ['PATH']+=os.pathsep+'E:\\APP\\hadoop-3.4.2\\bin'# 4. 推荐:设置 Driver Python 解释器os.environ["PYSPARK_DRIVER_PYTHON"]="D:\\APP\\Anaconda\\envs\\spark_env\\python.exe"

注意os.pathsep路径分隔符,Windows 下应为;,不是/


第二步:放置winutils.exe并修复权限

📌前提:你已经下载了winutils.exe(Hadoop 官方二进制,支持 Windows)

下载地址(请使用匹配版本):

https://github.com/cdarlint/winutils

建议使用版本:hadoop-3.4.2

步骤 1:将winutils.exe 、hadoop.dll放入 E:\APP\hadoop-3.4.2\bin 目录 和 c盘 C:\Windows\System32 里面
E:\APP\hadoop-3.4.2\bin\winutils.exe
步骤 2:以管理员身份打开 CMD

右键 “命令提示符” → “以管理员身份运行”

步骤 3:执行权限修复命令
winutils.exechmod777C:\tmp\Hive

💡 说明:

  • C:\tmp\Hive是 Hadoop 临时目录,用于存储临时文件
  • chmod 777给所有用户读写执行权限
  • 此步骤会修复 Hadoop 文件系统权限问题

成功提示:无报错,返回正常。

可选:你还可以用第三方工具如“联想电脑管家”修复系统 DLL 问题。


第三步:验证是否成功运行

frompysparkimportSparkConf,SparkContext# 配置环境(确保与上一致)os.environ["PYSPARK_PYTHON"]="D:\\APP\\Anaconda\\envs\\spark_env\\python.exe"os.environ['PYSPARK_TIMEOUT']='600'os.environ['PYSPARK_DRIVER_TIMEOUT']='600'os.environ['PATH']+=os.pathsep+'E:\\APP\\hadoop-3.4.2\\bin'# 创建 SparkContextconf=SparkConf().setMaster("local[*]").setAppName("test_saveAsTextFile")sc=SparkContext(conf=conf)# 创建 RDDrdd=sc.parallelize([1,2,3,4,5])# 成功输出!rdd.saveAsTextFile("D:/output1")print(" 数据已成功输出到 D:/output1")# 停止sc.stop()

运行结果

  • 生成文件夹D:/output1
  • 包含_SUCCESSpart-00000文件
  • 没有MSVCR120.dll报错

三、为什么推荐saveAsTextFile()

方案优点缺点
collect()+open()避开 native IO,稳定不能用于集群、本地写但不是标准输出
saveAsTextFile()标准、兼容生产、支持分布式文件系统依赖 native IO(但可修复)

推荐理由

  • 是 Spark 官方输出方式
  • 可用于 HDFS、S3、SFTP 等生产环境
  • 项目提交、团队协作、CI/CD 时更具规范性

四、完整三步模型:数据输入 → 计算 → 输出

# 1. 【数据输入】frompysparkimportSparkConf,SparkContextimportos os.environ["PYSPARK_PYTHON"]="D:\\APP\\Anaconda\\envs\\spark_env\\python.exe"os.environ['PYSPARK_TIMEOUT']='600'os.environ['PYSPARK_DRIVER_TIMEOUT']='600'os.environ['PATH']+=os.pathsep+'E:\\APP\\hadoop-3.4.2\\bin'conf=SparkConf().setMaster("local[*]").setAppName("sales_analysis")sc=SparkContext(conf=conf)rdd=sc.parallelize([1,2,3,4,5])# 2. 【数据计算】rdd2=rdd.map(lambdax:x*2)rdd3=rdd2.filter(lambdax:x>3)# 3. 【数据输出】 原生输出方式rdd3.saveAsTextFile("D:/output_final")print(" 三步流程完成:输入 → 计算 → 输出")sc.stop()

本代码可直接运行,无需collect(),无需open(),是标准 PySpark 工作流。


五、总结:成功运行saveAsTextFile()的 5 个关键点

步骤操作说明
1️⃣winutils.exe放入hadoop/bin缺少则无法访问本地 FS
2️⃣以管理员身份运行 CMD执行chmod才能生效
3️⃣chmod 777 C:\tmp\Hive修复权限,避免写入失败
4️⃣PATH包含hadoop/bin启用 native IO
5️⃣PYSPARK_TIMEOUT=600防止任务因超时中断

附录:完整环境配置模板(可复制)

importos# 1. 设置 Pythonos.environ["PYSPARK_PYTHON"]="D:\\APP\\Anaconda\\envs\\spark_env\\python.exe"os.environ["PYSPARK_DRIVER_PYTHON"]="D:\\APP\\Anaconda\\envs\\spark_env\\python.exe"# 2. 超时设置os.environ['PYSPARK_TIMEOUT']='600'os.environ['PYSPARK_DRIVER_TIMEOUT']='600'# 3. 加载 Hadoop native 库os.environ['PATH']+=os.pathsep+'E:\\APP\\hadoop-3.4.2\\bin'# 4. 创建 SparkContextfrompysparkimportSparkConf,SparkContext conf=SparkConf().setMaster("local[*]").setAppName("my_app")sc=SparkContext(conf=conf)# 测试rdd=sc.parallelize([1,2,3])rdd.saveAsTextFile("D:/test_output")print(" 成功写入")sc.stop()
http://www.jsqmd.com/news/574587/

相关文章:

  • 为了避免出现未知错误:支付宝使用秘钥模式取代证书模式
  • 【2026年最新600套毕设项目分享】springboot]农产品销售管理系统(14305)
  • 如何在Android设备上实现应用多开与隔离:VirtualApp技术指南
  • 从一次时序违例修复说起:实战中set_multicycle_path与时钟使能(CE)的配合使用指南
  • 【架构心法】撕碎“实验室完美”的傲慢!直视滚刀与高压现场的物理混沌,论工业级控制系统的“防御性悲观主义”
  • CosyVoice2-0.5B入门必看:3秒极速复刻+流式推理+自然语言指令实操手册
  • Graphormer高性能部署:PyTorch 2.8.0 + Torch-Geometric 2.4优化实践
  • AI 面试系统设计题怎么准备?5 个完整案例 + 回答框架
  • Qwen3.5-2B轻量化优势:2B参数模型在INT4量化后仅需1.8GB显存即可运行
  • Golang io.Reader接口如何用_Golang Reader接口教程【必备】
  • opencode令牌分析插件使用:API调用监控部署教程
  • 深入解析Kubernetes中的Pod优先级与抢占机制:构建高可用应用的调度艺术
  • `claude code --print` 核心含义与用法指南
  • CasRel关系抽取模型应用场景:专利文本中技术方案-组成部件-功能效果三元组抽取
  • H5-Dooring:零代码也能打造专业级H5页面的可视化编辑器解决方案
  • 告别手动记录:清音听真语音识别系统快速部署,中英文混合转录一键搞定
  • 从AI提问到以太坊钱包:一次数字取证如何还原嫌疑人的完整‘数字画像’
  • 万象视界灵坛快速部署:WSL2环境下Windows用户本地运行Bright-Pixel镜像
  • AQ智商测试
  • 告别重复劳动:用Python定制你的Labelme,实现自动化测量标注
  • SpringBoot+MyBatis-Plus批量插入避坑指南:如何避免多线程下的主键重复
  • 别再只用LSTM了!用LightGBM给它当“外挂”,金融时间序列预测精度飙升(附Python完整代码)
  • Wan2.2-I2V-A14B Java开发集成指南:SpringBoot后端服务调用
  • OpenClaw多模态研究助手:Kimi-VL-A3B-Thinking文献图表分析自动化
  • Local AI MusicGen创意展示:由‘neon lights vibe’触发的都市夜景音乐
  • 深入理解Kubernetes中的资源管理:Requests、Limits与QoS的终极指南
  • 告别单点跟踪!CoTracker如何用‘虚拟轨迹’和Transformer在单卡上搞定7万个点?
  • 避坑指南:Python中Theil-Sen和Mann-Kendall检验的5个常见错误
  • 【2026年最新600套毕设项目分享】基于springboot的大学生志愿服务活动管理系统(14306)
  • 立知-lychee-rerank-mm效果展示:医疗图文报告匹配度打分应用案例