R使用RJDBC写表到Hive

时间:2015-01-29 10:12:30

标签: r jdbc hive

我使用rjdbc成功连接了本地R3.1.2(win7 64bit rstudio)和远程配置单元服务器,

library(RJDBC)
.jinit()
dir = "E:/xxx/jars/hive/" 
for(l in list.files(dir)) {
  .jaddClassPath(paste( dir ,l,sep="")) }
options( java.parameters = "-Xmx8g" ) 
drv <- JDBC("org.apache.hadoop.hive.jdbc.HiveDriver",
        "E:/xxx/jars/hive/hive-jdbc-0.11.0.jar")

conn <- dbConnect(drv,  "jdbc:hive://10.127.130.162:10002/default", "", "" ) 
dbGetQuery(conn, "select * from test.test limit 10 ")

成功从hive读取数据,但我不能使用
来写R数据帧 dbWriteTable

data(iris)
dbWriteTable(conn, iris , "test.dc_test")

错误返回:

Error in .jcall(md, "Ljava/sql/ResultSet;", "getTables", .jnull("java/lang/String"), : method getTables with signature (Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Ljava/sql/ResultSet; not found

我的误用或其他方法需要吗?

2 个答案:

答案 0 :(得分:1)

我有一个部分答案。您对dbWriteTable的参数是相反的。模式是dbWriteTable(连接,tableName,数据),文档读取dbWriteTable(conn, name, value, ...)。话虽这么说,但我没有发现“正确的”#39;表单也可以,而是产生以下错误消息:

Error in .local(conn, statement, ...) : 
  execute JDBC update query failed in dbSendUpdate ([Simba][HiveJDBCDriver](500051) ERROR processing query/statement. Error Code: 40000, SQL state: TStatus(statusCode:ERROR_STATUS, sqlState:42000, errorCode:40000, errorMessage:Error while compiling statement: FAILED: ParseException line 1:41 mismatched input 'PRECISION' expecting ) near 'DOUBLE' in create table statement), Query: CREATE TABLE iris (`Sepal.Length` DOUBLE PRECISION,`Sepal.Width` DOUBLE PRECISION,`Petal.Length` DOUBLE PRECISION,`Petal.Width` DOUBLE PRECISION,Species VARCHAR(255)).)

(至少在为Hive使用Amazon的JDBC驱动程序时)。这个错误至少看起来很明显,为使数据插入表生成的查询在HiveQL中没有正确解析。修复,除了手动操作,我不确定。

答案 1 :(得分:0)

通过这些年来,我仍然无法找到完整的解决方案......但这里也是一个部分的,只能用于写入小数据。帧和多小从32 / 64bit变化,mac / win ...

首先将数据帧更改为字符向量

  

data2hodoop&lt; - paste0(      应用(数据帧,            1,函数(x)paste0(&#34;(&#39;&#34;,paste0(x,collapse =&#34;&#39;,&#39;&#34;),&#34 ;&#39;)&#34)),      崩溃=&#34;,&#34;)

然后使用insert将行写入hadoop

  

dbSendQuery(conn,paste(&#34; INSERT INTO&#34;,tbname,&#34; VALUES&#34;,data2hodoop,&#34;;&#34;)

在我的电脑中,WIN7 64BIT 16G,如果矢量&#39; data2hodoop&#39;大于50M, 会出现错误&#34; C堆栈使用量xxx太接近极限&#34 ;;

在我的Mac中,限制甚至更低,我找不到修改此限制的方法。