【发布时间】:2019-07-30 19:05:49
【问题描述】:
在使用 Spark 1.6.2 的 Java 应用程序中,我想在 CI 环境(travis 或 gitlabCI)上测试一些使用表(来自生产环境中的 Apache Hive)的 Spark SQL 查询。
如何注册一些 Spark 应用程序可以在没有外部 Hive 元存储的情况下使用的表?
注意:我不能在 Java 程序中这样做。
【问题讨论】:
标签: java apache-spark hive
在使用 Spark 1.6.2 的 Java 应用程序中,我想在 CI 环境(travis 或 gitlabCI)上测试一些使用表(来自生产环境中的 Apache Hive)的 Spark SQL 查询。
如何注册一些 Spark 应用程序可以在没有外部 Hive 元存储的情况下使用的表?
注意:我不能在 Java 程序中这样做。
【问题讨论】:
标签: java apache-spark hive
您可以使用 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 重写它。
【讨论】: