spark3.0教程-Spark on Hive:scala代码通过 Spark 查询 Hive中的表

说明

编写 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|
+-----+--------+

执行速度很快


原文出处:/show_1IX4KPSAbmdM.html