在 R 中的 Amazon EMR 上使用 Hive 的 JDBC 驱动程序

Using JDBC Driver for Hive on Amazon EMR in R

亚马逊provides a JDBC Driver for connecting to Hive. There is a JDBC package for R that seems like it should be able to make use of those drivers and allow access to Hive. In fact, others have clearly been able to access Hive from R with JDBC

我没有这么幸运。我已经在 instructions provided by Amazon 之后通过 SQL Workbench/J 成功地使用了 Amazon 驱动程序从 Hive 中提取一些数据。因此,我知道实际上 Amazon JDBC 驱动程序中包含的 .jars 足以连接到我的 EMR 集群上的 Hive (0.13.1) 版本,而且我也知道 SSH 隧道已经正确设置。

似乎以下 R 代码应该足以连接到 EMR 集群上的 Hive(遵循与 SQL Workbench/J 类似的配置选项,并从 "Using Hive from R with JDBC" 中抄袭一些注释博客 post"):

if (!require("DBI")) {install.packages("DBI");library("DBI")}
if (!require("rJava")) {install.packages("rJava");library("rJava")}
if (!require("RJDBC")) {install.packages("RJDBC",dep=TRUE);library("RJDBC")}
JDBCLib <- "~/AmazonHiveJDBC/1.0.0.1000/"
for(l in list.files(JDBCLib)){ .jaddClassPath(paste(JDBCLib,l,sep=""))}
drv <- JDBC("com.amazon.hive.jdbc3.HS2Driver", paste0(JDBCLib,"HiveJDBC3.jar"))
conn <- dbConnect(drv, "jdbc:hive2://localhost:10000/default", user="hadoop")

JDBC 函数 returns 毫无怨言的 drv 对象,其结构如下所示:

Formal class 'JDBCDriver' [package "RJDBC"] with 2 slots
  ..@ identifier.quote: chr NA
  ..@ jdrv            :Formal class 'jobjRef' [package "rJava"] with 2 slots
  .. .. ..@ jobj  :<externalptr> 
  .. .. ..@ jclass: chr "com/amazon/hive/jdbc3/HS2Driver"

但是,尽我所能,dbConnect returns 和

Error in .jcall(drv@jdrv, "Ljava/sql/Connection;", "connect", as.character(url)[1],  : 
  java.lang.NoClassDefFoundError: Could not initialize class com.amazon.hive.hive.core.Hive2JDBCDriver

我试过在 URL 中指定用户、指定数据库名称、根本不指定用户等等,但我也试过了。我还按照建议尝试了 URL 的几种变体here,例如"jdbc:hive2://localhost\default:10000;user=hadoop",但没有任何成功。在这一点上,我似乎非常接近成功,但还没有完全到达那里。我犯了什么错误?我该如何更正它?

Another question 没有收到任何答复,他们在示例代码中包含了 .jinit(),他们曾用来成功连接到配置单元。这是缺少的特殊酱汁。 .jinit() 启动 JVM,必须在将 jars 添加到 class 路径之前调用。