使用 DBI 包从 R 数据帧创建数据并将其插入到 Cloudera Impala

Posted

技术标签:

【中文标题】使用 DBI 包从 R 数据帧创建数据并将其插入到 Cloudera Impala【英文标题】:creating and inserting data from a R dataframe to Cloudera Impala with DBI package 【发布时间】:2018-12-10 17:38:34 【问题描述】:

我在 R 中创建了几个需要上传到 Cloudera Impala 的表(数据框),我正在使用 DBI 包连接 Impala。所以我有例如:

df

如何将 df 作为表格插入 Impala?

我已经看到使用 dbSendUpdate() 可以做到这一点,所以我做了这样的事情:

dbSendUpdate(dbh,paste0("Create Table db.df as select * from ",db))

但没有运气。

关于如何使用此功能或我可以使用的任何其他功能来处理此问题的任何想法?

【问题讨论】:

使用运行CREATE TABLEINSERT INTO命令的DBI::dbWriteTable 【参考方案1】:

我认为您应该改用 DBI 包中的函数 dbCreateTabledbWriteTable()

在您的情况下,您可以通过以下方式发送df

data <- DBI::dbCreateTable(con, "impala_new_df", df)

con 是您的数据库连接,"impala_new_df" 是 Impala 中所需的新表的名称,df 是您正在写入的数据框。显然,您需要对 Impala 实例进行读/写访问。

我相信dbSendUpdate 函数来自包RJDBC。仅当您的连接是jdbc,而不是odbc 时,这才有效。另外,我不相信您对paste0 的使用会按照您的意愿行事。

以下是 R 中数据库的有用参考: https://db.rstudio.com/odbc/

更新

由于您使用的是RJDBC,我相信以下应该可行:

dbSendUpdate(con, "Create Table ?", df)

与此处的解决方案类似:https://***.com/a/35407579/6535514

如果这不起作用,我会开始查看包 implyr 以了解解决此问题的其他方法

【讨论】:

是的,你是对的,它来自 RJDBC 包而不是 DBI,我使用的是 jdbc 连接。我尝试过类似 dbWriteTable(dbh,"db.mtcars"mtcars) 但我从 t 收到语法错误 是的,你是对的,它来自 RJDBC 包而不是 DBI,我使用的是 jdbc 连接。我尝试过类似 dbWriteTable(dbh,"db.mtcars"mtcars) 但我从 sql 语句中得到一个语法错误,告诉我不接受使用 DOUBLE PRECISION。 Impala 在创建表时不接受 Precision 这个词,但是 dbWriteTable 使用 DOUBLE PRECISION 作为默认类型。有什么办法可以改变吗?

以上是关于使用 DBI 包从 R 数据帧创建数据并将其插入到 Cloudera Impala的主要内容,如果未能解决你的问题,请参考以下文章

R 使用 dbi 更新数据库

为数据帧分配新名称并将其另存为R中的单独对象

如何在 hdf5 中有效地保存 python pandas 数据帧并将其作为 R 中的数据帧打开?

Pandas 创建时间序列并将其提取到新数据帧

在for循环中运行函数并将返回的数据帧添加到R中的列表中

来自 R DBI 的 Redshift 中的用户定义函数