首页 > 解决方案 > 为 CI 设置 Spark,如何模拟 Hive 表

问题描述

在 Java 应用程序中,使用 Spark 1.6.2,我想在 CI 环境(travis 或 gitlabCI)上测试一些使用表的 Spark SQL 查询(来自生产中的 Apache Hive)。

如何注册一些 Spark 应用程序可以在没有外部 Hive 元存储的情况下使用的表?

注意:我不能在 Java 程序中做到这一点。

标签: javaapache-sparkhive

解决方案


您可以使用 spark-hive 开箱即用的嵌入式 Hive 运行单元测试:

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-hive_${scala.compat.version}</artifactId>
        <version>${spark.version}</version>
    </dependency>

使用您选择的单元测试框架,您可以创建本地 SparkContext 和 HiveContext:

// TODO: set this up before running all your tests
val conf = new SparkConf().
  setMaster("local[*]").
  setAppName("test").
  set("spark.ui.enabled", "false").
  set("spark.app.id", "SparkHiveTests").
  set("spark.driver.host", "localhost")
val sc = new SparkContext(conf)
val hiveContext = new HiveContext(sc)
// default directory is /user/hive/warehouse which doesn't exist on my local machine so use a different dir
hiveContext.setConf("hive.metastore.warehouse.dir", "/tmp/hive/warehouse")

然后,您可以使用嵌入式 Hive 创建/删除表并运行查询!

// data will persist in this directory so drop the table to get a clean run if it exists
hiveContext.sql("DROP TABLE IF EXISTS src")
hiveContext.sql("CREATE TABLE src (key INT, value STRING)")
hiveContext.sql("LOAD DATA LOCAL INPATH 'src/test/resources/kv1.txt' INTO TABLE src")
val result = hiveContext.sql("SELECT count(*) FROM src").collect().head
assert(result(0) === 3l)

对不起这里的 Scala,但它在 Java 中应该非常相似。如果没有意义,请告诉我,我可以尝试用 Java 重写它。


推荐阅读