所有
我试图使用R中的RJDBC,rJava和DBI软件包从位于远程linux机器上的mapr hive / hadoop集群中的大型hive表中提取数据。
连接到配置单元群时没有任何问题。我尝试从中提取数据的表1的大小为500M(百万)行x16列。
这是代码:
options(java.parameters = "-Xmx32g" )
library(RJDBC)
library(DBI)
library(rJava)
hive_dir <- "/opt/mapr/hive/hive-0.13/lib"
.jinit()
.jaddClassPath(paste(hive_dir,"hadoop-0.20.2-core.jar", sep="/"))
.jaddClassPath(c(list.files("/opt/mapr/hadoop/hadoop-0.20.2/lib",pattern="jar$",full.names=T),
list.files("/opt/mapr/hive/hive-0.13/lib",pattern="jar$",full.names=T),
list.files("/mapr/hadoop-dir/user/userid/lib",pattern="jar$",full.names=T)))
drv <- JDBC("org.apache.hive.jdbc.HiveDriver","hive-jdbc-0.13.0-mapr-1504.jar",identifier.quote="`")
hive.master <- "xx.xxx.xxx.xxx:10000"
url.dbc <- paste0("jdbc:hive2://", hive.master)
conn = dbConnect(drv, url.dbc, "user1", "xxxxxxxx")
dbSendUpdate(conn, "set hive.resultset.use.unique.column.names=false")
df <- dbGetQuery(conn, "select * from dbname.table1 limit 1000000 ") # basically 1 million rows
以上工作完美,df data.frame包含我想要的内容。但是,如果我从最后一个代码段中删除限制,我会收到错误:
df <- dbGetQuery(conn, "select * from dbname.table1 ")
错误:
Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ", : Unable to retrieve JDBC result set for select * from dbname.table1 (Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask)
我用Google搜索了错误Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
的最后一部分,并尝试将这两个语句放在dbGetQuery
之前,但无法摆脱错误。
dbSendUpdate(conn, "SET hive.auto.convert.join=false")
dbSendUpdate(conn, "SET hive.auto.convert.join.noconditionaltask=false")
当我从select语句中删除限制时,有没有人知道我为什么会收到错误?它甚至适用于1.2亿行的限制,但需要很长时间。在这一点上,所花费的时间对我来说并不是一个问题。