Windows10本地Spark生成Parquet文件失败问题排查与解决
问题描述
通过Spark读取CSV并转换为Parquet时,Windows 10本地运行失败,但代码在Google Colab可正常执行。
读取CSV代码:
variable = spark.read.csv(r'C:\Users\xxxxx.xxxx\Desktop\archive\test.csv', sep=';', inferSchema=True, header=True)
尝试两种写入Parquet的路径格式:
# 方式一 variable.write.parquet( path=r'C:\Users\\xxxxx.xxxx\Desktop\archive\parquet\new.parquet', mode='overwrite' ) # 方式二 variable.write.parquet( path=r'C:\Users\xxxxx.xxxx\Desktop\archive\parquet\\', mode='overwrite' )
两种方式均触发相同错误:
Py4JJavaError: An error occurred while calling o186.parquet. : org.apache.spark.SparkException: Job aborted. at org.apache.spark.sql.errors.QueryExecutionErrors$.jobAbortedError(QueryExecutionErrors.scala:651) at org.apache.spark.sql.execution.datasources.FileFormatWriter$.write(FileFormatWriter.scala:288) at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand.run(InsertIntoHadoopFsRelationCommand.scala:186) at org.apache.spark.sql.execution.command.DataWritingCommandExec.sideEffectResult$lzycompute(commands.scala:113) at org.apache.spark.sql.execution.command.DataWritingCommandExec.sideEffectResult(commands.scala:111) at org.apache.spark.sql.execution.command.DataWritingCommandExec.executeCollect(commands.scala:125) at org.apache.spark.sql.execution.QueryExecution$$anonfun$eagerlyExecuteCommands$1.$anonfun$applyOrElse$1(QueryExecution.scala:98
核心错误信息:
Job aborted due to stage failure: Task 1 in stage 14.0 failed 1 times, most recent failure: Lost task 1.0 in stage 14.0 (TID 63) (XXXXX-xxxx.xxx.local executor driver): java.io.IOException: (null) entry in command string: null chmod 0644 C:\Users\xxxx.xxxx\Desktop\xxx.parquet_temporary\0_temporary\attempt_202304111306381850890757855117295_0014_m_000001_63\part-00001-1ea07aa8-0302-492c-993c-86ce32f575d8-c000.snappy.parquet
原因分析
Spark底层依赖Hadoop的文件系统工具,chmod是Linux/Unix系统的权限修改命令,Windows系统没有该命令。Google Colab基于Linux环境,因此代码可正常运行;而Windows本地环境中,Spark尝试执行chmod命令时找不到对应工具,导致任务中止。
解决方法
配置Windows版Hadoop工具包
- 下载与Spark依赖版本匹配的winutils工具包
- 创建
HADOOP_HOME环境变量,指向winutils所在目录 - 将
%HADOOP_HOME%\bin添加到系统PATH环境变量 - 在
%HADOOP_HOME%\etc\hadoop目录下创建hadoop-env.cmd文件,添加内容:set HADOOP_HOME=你的winutils路径
修改Spark文件系统配置
在初始化SparkSession时添加配置,强制使用本地文件系统实现,避免调用Linux权限命令:from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("CSVtoParquet") \ .config("spark.hadoop.fs.file.impl", "org.apache.hadoop.fs.LocalFileSystem") \ .getOrCreate()修正写入路径格式
避免路径末尾带反斜杠,将第二种路径改为:variable.write.parquet( path=r'C:\Users\xxxxx.xxxx\Desktop\archive\parquet', mode='overwrite' )注意使用原始字符串
r''时,单个反斜杠即可,不要出现重复反斜杠。以管理员身份运行程序
右键点击Python IDE或命令提示符,选择「以管理员身份运行」,避免因文件权限不足导致的写入失败。
内容的提问来源于stack exchange,提问作者Guilherme
相关产品推荐
相关产品推荐

