一、 环境准备
在开始之前,安装以下软件:
1.1 JDK:推荐JDK8或JDK11(Spark 3.x对JDK11支持良好,但JDK8最稳妥)。
1.2 IntelliJ IDEA:Community(社区版)或Ultimate(旗舰版)均可。
1.3 Maven:用于依赖管理和项目打包。
1.4 Scala插件:打开IDEA->Settings->Plugins->搜索Scala并安装重启(此步骤在使用scala时做也可以)。

二、 创建 Maven 项目
2.1 打开idea,左上角file=》new=》project

2.2 创建一个New Project,输入名称name,语言选择java,build system选择maven(方便后续打包依赖),jdk建议选jdk8

2.3 在main目录上右键new一个directory,名称叫scala

2.4 在scala目录上右键mark directory as 为sources root
2.5 配置pom.xml(核心)
在pom.xml中配置Scala版本、Spark版本以及打包插件
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>sparkmysqltohive</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<!-- 【修改点 1】拆分为两个变量 -->
<scala.binary.version>2.12</scala.binary.version> <!-- 用于拼接 Spark 依赖后缀 -->
<scala.version>2.12.17</scala.version> <!-- 用于 Scala 库的精确版本 (Spark 3.4.x 推荐 2.12.17) -->
<!--<spark.version>3.3.1</spark.version> -->
<spark.version>3.4.2</spark.version>
<hive.version>3.1.3</hive.version>
<hadoop.version>3.2.2</hadoop.version>
<slf4j.version>1.7.29</slf4j.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- <scope>compile</scope>-->
<scope>provided</scope>
</properties>
<dependencies>
<!--spark-->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
<scope>${scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
<scope>${scope}</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
<scope>${scope}</scope>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
<!--log4j + slf4j-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 【关键新增】1. Scala 编译插件:没有它,.scala 文件不会被编译! -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>4.8.1</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<!-- 将依赖的jar包中的class文件打进生成的jar包-->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<!-- 只打包你真正需要的文件,比如某些 sql 脚本或 properties -->
<include>**/*.properties</include>
</includes>
<excludes>
<!-- 【关键】排除本地调试用的 Hadoop/Hive/Kerberos 配置 -->
<exclude>**/*.xml</exclude>
<exclude>**/*.keytab</exclude>
<exclude>**/krb5.conf</exclude>
<exclude>**/log4j*.properties</exclude>
</excludes>
</resource>
</resources>
</build>
</project>
配置完成后,点击右上角的Load Maven Changes(刷新图标)下载依赖。

2.6 添加 Scala 框架支持
因为创建的是Maven项目,IDEA默认不知道要写Scala代码。
2.6.1 在左侧项目目录树中,右键点击项目根目录。
2.6.2 选择 Add Framework Support...
2.6.3 勾选Scala,选择刚才配置的Scala版本(如2.12.15)如果没有就create一个,点击OK。
2.6.4 IDEA会自动创建src/main/scala和src/test/scala目录。


2.7 创建一个Scala Object


scala
import org.apache.spark.sql.SparkSession
object sparkdemo {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("SparkSQLDemo")
.master("local[*]") // 本地测试用
.getOrCreate()
import spark.implicits._
val df = Seq((1, "张三", 25), (2, "李四", 30)).toDF("id", "name", "age")
df.createOrReplaceTempView("user")
spark.sql("SELECT * FROM user WHERE age > 26").show()
spark.stop()
}
}
解决本地运行的"Provided"坑点(⚠️极其重要)
在pom.xml中,我们将Spark依赖的scope设置为了provided(因为提交到集群时,集群本身有Spark环境,不需要打包进去以减小jar体积)。但这会导致在IDEA本地直接点击Run时报ClassNotFoundException。
这是因为pom.xml中Spark相关依赖的被设置为provided(定义的${scope}变量值为provided)。这意味着这些依赖只在编译时使用,不会被打包进最终的JAR中。
这是Spark项目打包的标准做法,因为集群环境中已经存在这些JAR,无需重复打入,还能避免版本冲突。
当使用java -jar your.jar直接执行时,JVM只会加载JAR包内的class,而Spark的class不在其中,因此报ClassNotFoundException。
解决办法
2.7.1 点击右上角的Run/Debug Configurations(或者在main方法左侧绿色三角形选择Modify Run Configuration)。
2.7.2 找到Modify options(或Alt+M)。
2.7.3 勾选Add dependencies with "provided" scope to classpath。
2.7.4 点击Apply -> OK。
2.7.5 点击运行,即可在IDEA控制台看到正确的输出结果。

scala
+---+----+---+
| id|name|age|
+---+----+---+
| 2|李四| 30|
+---+----+---+