R和MySQL - 使用dbWriteTable()在写入表之前检查表中是否存在行

时间:2016-08-25 20:29:07

标签: mysql r

我使用R包RMySQL和dbConnect将我的R连接到我公司的MySQL数据库。简而言之,我的R脚本连接到MySQL数据库,从数据库中提取一个表(table1),使用该表进行一些分析,然后写入MySQL数据库中的另一个表(table2)。

所以table2不是从数据库中提取的,而是需要附加我在R中做的工作。我在R中添加了一些其他分析,然后将表重新写入MySQL数据库,使用新信息附加前一个数据库。我当前用来写入table2的代码行是:

dbWriteTable(con_hub, value = my_R_dataframe, name = "table2", append = TRUE, row.names = FALSE)

我需要确保在写入此之前my_R_dataframe中没有已存在于table2数据库表中的行,因为重复项很难处理。有没有人对此有任何建议?另外 - 我宁愿不必将MySQL数据库中的table2拉入R,因为该查询会为我的代码增加相当多的时间。

谢谢,

1 个答案:

答案 0 :(得分:3)

考虑以下两种方式之一:SQL驱动的重复数据删除或R驱动的重复数据删除解决方案。对于前者,您需要使用运行经典LEFT JOIN...IS NULL/NOT EXISTS/NOT IN SQL查询的临时登台表。对于后者,您可以导入数据框中的所有内容,附加当前的df,然后运行R unique()。然而,听起来你并不打算为后者,但我展示给未来的读者。

SQL (使用具有目标表格结构的临时表)

# OVERWRITE TEMP EACH TIME
dbWriteTable(con_hub, value = my_R_dataframe, 
                      name = "table2_temp", 
                      overwrite = TRUE,                        
                      row.names = FALSE)

# RUN LEFT JOIN...IS NULL QUERY (COMPARE COLS --COL1, COL2, COL3-- ADD/REMOVE AS NEEDED)
dbSendQuery(con_hub, paste0("INSERT INTO table2", 
                            " SELECT * FROM table2_temp",
                            " LEFT JOIN table2",
                            "   ON table2_temp.col1 = table2.col1", 
                            "   AND table2_temp.col2 = table2.col2",
                            "   AND table2_temp.col3 = table2.col3",
                            " WHERE table2.col1 IS NULL",
                            "   OR table2.col2 IS NULL",
                            "   OR table2.col3 IS NULL"))

R (请参阅表格2数据,考虑是否对资源过于沉重,如果所有列都重新删除,则首选

# RETRIEVE table2 DATA
table2df <- dbGetQuery(con_hub, "SELECT * FROM table2")

# APPEND BOTH DATAFRAMES
stackeddf <- rbind(table2df, my_R_dataframe)

# RETURN UNIQUE ROWS
finaldf <- unique(stackeddf)

# OVERWRITE DESTINATION TABLE EACH TIME
dbWriteTable(con_hub, value = finaldf, 
                      name = "table2", 
                      overwrite = TRUE,                         
                      row.names = FALSE)

# CLEAN UP ENVIRON OF UNNEEDED OBJECTS
rm(table2df, stackeddf, finaldf)
gc()