说明
编写 scala 代码通过 Spark 查询 Hive中的表
pom.xml
添加依赖
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.12</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
<!-- 有类冲突,所以移除 -->
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.0</version>
</dependency>
完整依赖
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-yarn_2.12</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.12</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.0</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.3.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
hive-site.xml
指定hive配置,因为spark读取hive上的数据
方式一
将 hive 的 /program/hive-3.1.2/conf/hive-site.xml 文件,复制到 resources 下
还要修改该文件,加上下面配置:
<!-- 不加下面配置会报错 -->
<property>
<name>hive.exec.scratchdir</name>
<value>hdfs://hadoop1:8020/tmp/hive</value>
</property>
缺点: 该配置文件含有 大量 Hive需要配置,如:MySQL 的用户名、密码,会暴露信息
方式二(推荐)
只需要指定 metastore 服务的 url 即可
在 resources 目录下创建 hive-site.xml 文件,内容如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定存储元数据要连接的地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop1:9083</value>
</property>
<!-- 不加下面配置会报错 -->
<property>
<name>hive.exec.scratchdir</name>
<value>hdfs://hadoop1:8020/tmp/hive</value>
</property>
</configuration>
解释
不加下面配置会报错,详见 链接
<property>
<name>hive.exec.scratchdir</name>
<value>hdfs://hadoop1:8020/tmp/hive</value>
</property>
log4j.properties(可略)
log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
scala
关键代码
通过 SparkSession 启用 Hive 支持:
SparkSession.builder().enableHiveSupport()
完整代码
package std
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}
object Std1 {
def main(args: Array[String]): Unit = {
val sc = new SparkConf().setAppName("SparkSQL")
// 增加 enableHiveSupport() 方法,启用 hive 支持
val spark = SparkSession.builder().enableHiveSupport().config(sc).getOrCreate()
val res: DataFrame = spark.sql("select empno,avg(sal) from emp group by empno order by empno ;")
res.printSchema()
res.show()
spark.close()
}
}
运行
在该文件 点右键,如按下图点击:
设置本地运行模式,如下图:
在下图红框处输入:-Dspark.master=local[*],表示本地运行模式,如下图
在下图红框处输入 HADOOP_USER_NAME=root,表示以 root 用户运行,如下图:
否则报错,详见链接
执行结果
root
|-- empno: integer (nullable = true)
|-- avg(sal): double (nullable = true)
2022-11-19 10:32:49,743 WARN [org.apache.spark.executor.ProcfsMetricsGetter] - Exception when trying to compute pagesize, as a result reporting of ProcessTree metrics is stopped
+-----+--------+
|empno|avg(sal)|
+-----+--------+
| 7369| 800.0|
| 7499| 1600.0|
| 7521| 1250.0|
| 7566| 2975.0|
| 7654| 1250.0|
| 7698| 2850.0|
| 7782| 2450.0|
| 7788| 3000.0|
| 7839| 5000.0|
| 7844| 1500.0|
| 7876| 1100.0|
| 7900| 950.0|
| 7902| 3000.0|
| 7934| 1300.0|
+-----+--------+
执行速度很快




