向红移表添加行而不是替换表

Posted

技术标签:

【中文标题】向红移表添加行而不是替换表【英文标题】:Adding row to redshift table rather than replacing table 【发布时间】:2017-07-19 21:58:02 【问题描述】:

我使用替换表命令将以下数据发送到 redshift - 是否有命令向表中添加新行而不是替换整个数据?

PipelineSimulation<-matrix(,42,7)
PipelineSimulation<-as.data.frame(PipelineSimulation)
PipelineSimulation[1,1]<-"APAC"
PipelineSimulation[1,2]<-"Enterprise"
and so on through
PipelineSimulation[42,3]<-"Commit"
PipelineSimulation[42,4]<-"Upsell"
PipelineSimulation[42,5]<-NAMEFURate
PipelineSimulation[42,6]<-mean(NFUEntTotals)
PipelineSimulation[,7]<-Sys.time()

然后我用它进入红移

library(RPostgres)
library(redshiftTools)
library(RPostgreSQL)
library("aws.s3")
library("DBI")
drv<-dbDriver('PostgreSQL')
con <- dbConnect(RPostgres::Postgres(), host='bi-prod-dw-
instance.cceimtxgnc4w.us-west-2.redshift.amazonaws.com', port='5439', 
dbname= '***', user="***", password="***", sslmode='require')
query="select * from everyonesdb.jet_pipelinesimulation_historic;"
result<-dbGetQuery(con,query)
print (nrow(result))
Sys.setenv("AWS_ACCESS_KEY_ID" = "***",
       "AWS_SECRET_ACCESS_KEY" = "***",
       "AWS_DEFAULT_REGION" = "us-west-2")
b=get_bucket(bucket = 'bjnbi-bjnrd/jetPipelineSimulation')
rs_replace_table(PipelineSimulation, con, 
tableName='everyonesdb.jet_pipelinesimulation_historic', bucket='bjnbi-
bjnrd/jetPipelineSimulation',split_files =2)

因此,我想保留旧数据,而不是 rs_replace_table,如果可能的话,只需将新行添加到现有表中

【问题讨论】:

【参考方案1】:

来自How to bulk upload your data from R into Redshift:

rs_replace_table 截断目标表,然后从数据框中完全加载它,只有在您不关心它保存的当前数据时才这样做。

另一方面,rs_upsert_table 替换具有重合键的行,并插入表中不存在的行。

使用rs_upsert_table 代替rs_replace_table 能解决您的问题吗?

【讨论】:

如何为此定义重合键? 用户在rs_upsert_table 中将重合键定义为rs_upsert_table(my_other_data, dbcon=con, tableName = 'mytable', bucket="mybucket", keys=c('id', 'date'))。在这种情况下,重合键将是具有相同 id 和日期值的行。

以上是关于向红移表添加行而不是替换表的主要内容,如果未能解决你的问题,请参考以下文章

提高效率的红移表设计

Python/SQLAlchemy:如何将巨大的红移表保存到 CSV?

从红移表中获取上次更新时间戳

有啥方法可以在 Excel 中编辑红移表?

使用清单从多个 s3 文件夹加载红移表

如何从 pcollection 将多个值写入红移表