亚马逊provides a JDBC Driver用于连接到Hive。有一个JDBC package for R似乎应该能够利用这些驱动程序并允许访问Hive。事实上,其他人显然能够访问Hive from R with JDBC。
我没有那么幸运。我已经通过instructions provided by Amazon之后的SQL Workbench / J成功使用了亚马逊驱动程序来从Hive中提取一些数据。因此,我知道在实践中,Amazon JDBC驱动程序中包含的.jars足以连接到我的EMR集群上的Hive(0.13.1)版本,我也知道SSH隧道已正确设置。
似乎以下R代码应该足以连接到EMR集群上的Hive(遵循与SQL Workbench / J类似的配置选项,以及从“使用来自R的JDBC中使用Hive”博客文章中的一些注释):
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
函数返回没有抱怨的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
返回
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中指定用户,指定dbname,根本不指定用户等。我还尝试了一些建议here的URL变体,例如: “jdbc:hive2:// localhost \ default:10000; user = hadoop”,但没有任何成功。在这一点上,我似乎非常接近成功,但并没有完全达到目标。我犯了什么错误?我该如何纠正?
答案 0 :(得分:0)
Another question,未收到任何答案,在他们用于成功连接到配置单元的示例代码中包含.jinit()
。这是丢失的特殊酱汁。 .jinit()
启动JVM,必须在将jar添加到类路径之前调用它。