Spark 3.x环境下如何正确初始化SparkSession加载CSV文件
Spark 3.x 初始化与CSV读取问题解决方案
核心问题1:找不到SparkSession类的两个原因
- 导包路径错误:SparkSession从Spark2.0版本引入开始就不属于
org.apache.spark根包,而是归在SQL模块下,仅导入org.apache.spark._无法加载该类。正确导入语句为:
// 仅导入SparkSession import org.apache.spark.sql.SparkSession // 如果需要用到DataFrame、Row等SQL相关类,可直接导入整个sql包 import org.apache.spark.sql._
- 依赖缺失:如果导包后依然提示找不到类,检查项目构建配置,确认引入了
spark-sql模块依赖,仅引入spark-core依赖不包含SparkSession相关代码。以sbt配置为例,Spark 3.3.0 + Scala 2.13的正确依赖写法为:
libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.3.0" % Provided
本地调试时可以去掉Provided作用域,打包提交到集群时再加即可。
核心问题2:SparkSession初始化代码顺序错误
你参考的初始化代码把.builder()的调用顺序放错了,builder是SparkSession的静态方法,必须作为链式调用的起点,后续的master、appName等配置都是Builder实例的方法。正确的本地初始化代码如下:
val spark = SparkSession .builder() .master("local[*]") // 和你之前SparkContext配置一致,用本地所有CPU核心,比单线程的local配置性能更好 .appName("SparkTest") .getOrCreate()
初始化完成后,可以直接通过spark.sparkContext获取对应的SparkContext实例,不需要再手动new SparkContext,避免重复启动上下文抛出异常。
CSV文件读取的标准实现
Spark 3.x内置了CSV数据源支持,不需要引入第三方依赖,初始化SparkSession后直接调用内置API即可读取:
val csvDf = spark.read .format("csv") .option("header", "true") // 首行为字段名时开启该配置 .option("inferSchema", "true") // 自动推断字段类型,生产环境建议手动指定Schema提升性能 .load("/path/to/your/file.csv") // 也可以使用更简洁的封装API,效果和上面完全一致 val csvDf2 = spark.read .option("header", "true") .csv("/path/to/your/file.csv")
读取后得到的DataFrame可以直接写SQL查询、做结构化处理,也可以调用.rdd方法转成RDD做低阶操作。
不建议退回SparkContext方式读取CSV:手动通过SparkContext读文本再解析CSV的写法容错性差、性能低,且无法直接使用Spark SQL的结构化能力,没有实际使用价值。
内容的提问来源于stack exchange,提问作者Aidan
相关产品推荐
相关产品推荐

