如何将“tbl_df”“tbl”“data.frame”对象转换为“tbl_Redshift”“tbl_dbi”“tbl_sql”“tbl_lazy”“tbl”对象进行上传?

问题描述 投票:0回答:1

我对使用服务器进行数据分析非常陌生,我对“tbl_df”“tbl”“data.frame”对象和“tbl_Redshift”“tbl_dbi”“tbl_sql”“tbl_lazy”“tbl”是什么完全感到困惑在 R 中?我知道与 Redshift 服务器和 tbl-lazy 表相关的东西,但仅此而已。

我一直在关注以前分析师的工作,我使用collect()将一堆数据拉到本地计算机上,在尝试将其上传回服务器之前进行一些转换。但是,由于某种原因,我无法使用compute()上传数据,我相信原因是因为对象本身从“tbl_Redshift”“tbl_dbi”“tbl_sql”“tbl_lazy”变成了“tbl_df”“tbl”“data.frame” “tbl”。

有没有办法将其转换回来以便我可以上传它?预先感谢。

r dplyr amazon-redshift dbi dbplyr
1个回答
0
投票

让我们首先确保核心概念清晰:

  • tbl_df
    tbl
    data.frame
    都是本地对象,数据存在于本地 R 内存中。
  • tbl_Redshift
    tbl_dbi
    tbl_sql
    都是远程对象,其中数据存在于数据库中,并且 R 在本地 R 内存中具有指向数据库的指针/查询/连接。

collect
命令将数据从远程数据库检索到本地 R 内存中。因此,它将
tbl_Redshift
tbl_dbi
tbl_sql
类型的对象转换为
tbl_df
tbl
、0r
data.frame
类型的对象。

compute
命令适用于远程对象(
tbl_Redshift
tbl_dbi
tbl_sql
),并将计算的临时/中间阶段保存到数据库,从而创建新的远程对象。这有助于减少额外的计算。它不能用于从本地 R 内存复制数据。

换句话说:

  • collect
    :远程数据输入->本地数据输出
  • compute
    :远程数据输入->远程数据输出

听起来你需要的是:本地数据输入->远程数据输出。

为此,有两种广泛的选择:

  1. 重新设计代码以避免
    collect
    。如果数据从未从服务器复制到本地 R 内存中,那么您永远不必将其传回。
  2. 使用专为将数据复制到服务器而设计的功能。为此,我使用
    DBI::dbWriteTable
    命令。下面的示例函数。
copy_from_r_to_sql <- function(db_conn, db, schema, sql_table_name, r_table_name) {
  DBI::dbWriteTable(
    db_conn,
    DBI::Id(
      catalog = db,
      schema = schema,
      table = sql_table_name
    ),
    r_table_name
  )
}

(这是我的 dbplyr 助手之一的精简版这里

© www.soinside.com 2019 - 2024. All rights reserved.