我使用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
我的误用或其他方法需要吗?
答案 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)
首先将数据帧更改为字符向量
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中,限制甚至更低,我找不到修改此限制的方法。