设置Spark for CI,如何模拟Hive表

时间:2019-03-08 17:49:58

标签: java apache-spark hive

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

如何注册一些无需外部Hive元存储即可供Spark应用程序使用的表?

注意:我无法在Java程序中执行此操作。

1 个答案:

答案 0 :(得分:2)

您可以使用带有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重写。