如何用dplyr的compute()在DB2不同Schema创建持久化表?
在DB2中用dplyr创建持久化表的解决方案
我来帮你搞定这个在DB2里用dplyr直接创建持久化表的问题!不用把数据拉到R里,直接在数据库端操作完全可行,下面给你两种靠谱的方法:
1. 修复compute()的用法
你之前的代码框架问题出在目标表的指定方式上,DB2对schema和表名的识别需要更明确的定义。试试下面修正后的代码:
dplyr::tbl(con, in_schema("SCHEMA_A", "TABLE")) %>% dplyr::compute( name = Id(schema = "SCHEMA_B", table = "NEW_TABLE"), temporary = FALSE, analyze = FALSE, overwrite = TRUE # 若目标表已存在需要覆盖,就加这个参数 )
参数解释:
name = Id(schema = "SCHEMA_B", table = "NEW_TABLE"):用Id()对象明确指定目标表的schema和名称,这是DB2下最可靠的方式,避免字符串解析出错。temporary = FALSE:这个是核心!默认compute()会创建临时表,必须设为FALSE才能生成持久化表。overwrite = TRUE:如果SCHEMA_B.NEW_TABLE已经存在,加上这个参数可以直接覆盖(注意备份数据)。analyze = FALSE:按你的需求保留,不需要生成表统计信息就保持这个设置。
2. 用copy_to()替代dbWriteTable()
如果你想用copy_to()来实现,也可以直接传递dbplyr的tbl对象,让操作完全在数据库端执行:
# 先获取源表的引用 source_table <- dplyr::tbl(con, in_schema("SCHEMA_A", "TABLE")) # 直接在数据库端复制并创建新表 dplyr::copy_to( dest = con, df = source_table, name = Id(schema = "SCHEMA_B", table = "NEW_TABLE"), temporary = FALSE, overwrite = TRUE, analyze = FALSE )
这里的关键是df参数支持接收dbplyr的远程tbl对象,而不是只能传R本地的数据框,这样就不会把数据拉到R里,全程在DB2内部完成复制和表创建。
额外注意事项
- 权限验证:确保你的数据库账号拥有
SCHEMA_B下的建表权限,以及SCHEMA_A.TABLE的读取权限,不然会抛出权限错误。 - 数据修改:如果需要对源表做修改(比如过滤行、修改字段类型、新增计算列),直接在
compute()/copy_to()之前加入dplyr操作即可,比如:dplyr::tbl(con, in_schema("SCHEMA_A", "TABLE")) %>% dplyr::filter(status == "ACTIVE") %>% dplyr::mutate(new_col = old_col * 2) %>% dplyr::compute(name = Id(schema = "SCHEMA_B", "NEW_TABLE"), temporary = FALSE) - 结果验证:执行完后可以用下面的代码检查表是否创建成功:
dplyr::tbl(con, in_schema("SCHEMA_B", "NEW_TABLE")) %>% head()
内容的提问来源于stack exchange,提问作者MatSchu
相关产品推荐
相关产品推荐

