1

我想将 R 中的数据框写入 Hadoop Hive 中的新表。我在 RODBC 包中使用 sqlSave(),如下所示。表结构是在 Hadoop 中创建的,但是在将任何数据插入表之前我得到一个错误。错误消息包含在下面。有关如何将 R 中的数据框写入 Hadoop 中的新表的任何建议?

代码

column_1 = c("a","b","c")

column_2 = c("d","e","f")

column_3 = c("g","h","i")

test.df = data.frame(column_1,column_2,column_3)

columnTypes <- list(column_1='varchar(255)',
                    column_2='varchar(255)',
                    column_3='varchar(255)')

sqlSave(dbConn, test.df, 'db.tablename', verbose=T, append=T, rownames = F, fast = F, varTypes = columnTypes)

错误信息

Query: CREATE TABLE db.tablename  ("column_1" varchar(255), "column_2" varchar(255), "column_3" varchar(255))
Query: INSERT INTO db.tablename ( "column_1", "column_2", "column_3" ) VALUES ( 'a', 'd', 'g' )
Error in sqlSave(dbConn, test.df, "db.tablename", verbose = T,  : 
[Microsoft][HiveODBC] (55) Insert operation is not support for table: HIVE.db.tablename
[RODBC] ERROR: Could not SQLExecDirect 'INSERT INTO db.tablename ( "column_1", "column_2", "column_3" ) VALUES ( 'a', 'd', 'g' )'
4

2 回答 2

0

我实际上有同样的问题,我需要我们团队的用户开始使用 Hive,而且他们中的大多数都是 Hive 用户。这是我到目前为止所做的: - 在 R 中创建一个自定义函数,以自动为新的 hive 表生成 create table 语句 - 转换数据类型以准备 hive,将因子转换为字符,排列日期格式 - 为加载到 hive - 使用 rhdfs 将文本文件移动到 Hadoop(在我的情况下为 MapR),无论是在您想要的位置(外部表)还是加载到 hive 仓库。

希望有人有更好的解决方案,但对我来说这有效。通过创建 R 包来实现流程自动化,但我还远未完成。

于 2018-06-23T08:18:36.090 回答
0

像这样设置您的连接:

library(odbc)
con <- DBI::dbConnect(odbc::odbc(),
                  Driver    ="HIVE",
                  Host      = "myhadoopurl.com",
                  Port      = "8443",
                  Schema    = "my_schema_db_name",            
                  HttpPath  = "gateway/default/hive",   
                  AuthMech  = "3",
                  HiveServerType  = "2",
                  ThriftTransport = "2",
                  UID = my_user_name,
                  PWD = my_pw)

#Got an error here, that Hive doesn't like the iris . in the column names so...
names(iris)<-gsub("\\.","_",names(iris))

DBI::dbWriteTable(con, "my_schema_db_name.iris", iris) 

我得到了一些许可被拒绝的错误,这是误导性的。在修改连接设置上的模式名称和 dbWriteTable 函数后,它起作用了。追加:

DBI::dbWriteTable(con, "my_schema_db_name.iris", iris, append=TRUE)

它不起作用,如果我将连接架构留空并使用 Hive 的默认架构进行连接,那就是我得到权限错误的地方。

于 2021-01-27T18:54:10.053 回答