Spark读取CSV文件时出现Java UnsatisfiedLinkError错误求助
解决Spark读取CSV时的Windows原生库错误
在Windows环境下执行spark.read.csv("donation/block*.csv")读取带通配符的CSV文件时,出现java.lang.UnsatisfiedLinkError: 'boolean org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(java.lang.String, int)'错误,本质是Hadoop依赖的Windows原生库缺失、不兼容或权限问题,以下是可行的解决方法:
配置Hadoop原生库
- 下载与你的Spark依赖的Hadoop版本匹配的Windows原生库文件(包含
winutils.exe和hadoop.dll) - 将文件放到一个目录(如
C:\hadoop\bin) - 设置系统环境变量
HADOOP_HOME为C:\hadoop,并将%HADOOP_HOME%\bin添加到系统PATH中 - 重启运行Spark的IDE或命令行窗口,使环境变量生效
- 下载与你的Spark依赖的Hadoop版本匹配的Windows原生库文件(包含
禁用Hadoop原生IO实现
在Spark初始化时添加配置,强制使用非原生IO:import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("ReadDonationData") .config("spark.hadoop.hadoop.native.lib", "false") .config("spark.hadoop.io.native.lib.available", "false") .getOrCreate() val df = spark.read.csv("donation/block*.csv")也可以在提交任务时通过参数指定:
spark-submit --conf spark.hadoop.hadoop.native.lib=false --conf spark.hadoop.io.native.lib.available=false your-application.jar检查文件路径权限
确保当前运行Spark的用户对donation目录及其中的CSV文件拥有读写权限,必要时以管理员身份启动IDE或命令行执行代码匹配Spark与Hadoop版本
确认使用的Spark版本和其依赖的Hadoop版本兼容(例如Spark 3.3.x对应Hadoop 3.3.x,Spark 2.4.x对应Hadoop 2.7/2.9.x),版本不匹配也可能引发原生库调用错误
内容的提问来源于stack exchange,提问作者eashwar natarajan
相关产品推荐
相关产品推荐

