java - 为 CI 设置 Spark,如何模拟 Hive 表
问题描述
在 Java 应用程序中,使用 Spark 1.6.2,我想在 CI 环境(travis 或 gitlabCI)上测试一些使用表的 Spark SQL 查询(来自生产中的 Apache Hive)。
如何注册一些 Spark 应用程序可以在没有外部 Hive 元存储的情况下使用的表?
注意:我不能在 Java 程序中做到这一点。
解决方案
您可以使用 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 重写它。
推荐阅读
- excel - 如何使用 VBA 在 Jira 中制作 sprint 速度图?
- java - 当有两行输入时从Java中读取文件
- javascript - 调用 Javascript Array 对象的特定元素
- wordpress - wordpress 网站 AWS 加载时间过长
- android - 管理多平台应用程序内购买
- spring - 如何在 Spring Boot 的 Rest API 中验证 POST 方法的不需要的请求主体参数
- object-detection - 为什么我的目标检测训练损失非常低(<1),但精度仍然为 0?
- java - 如何仅通过修改 Netbeans 中的父级来影响所有子级?
- python - 如何使用 Selenium 和 Python 启动 Edge (Chromium) 浏览会话
- asp.net-mvc - 使用 Owin/Katana/OIDC 的客户端如何使用刷新令牌?