在Java应用程序中,使用Spark 1.6.2,我想在CI env(travis或gitlabCI)上测试一些使用表的Spark SQL查询(来自生产中的Apache Hive)。
如何注册一些无需外部Hive元存储即可供Spark应用程序使用的表?
注意:我无法在Java程序中执行此操作。
答案 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重写。