一张大桌子或许多小桌子

时间:2016-04-29 18:57:47

标签: r monetdb monetdblite

我已阅读本网站上的MonetDB.R / MonetDBLite帖子,CRAN PDF以及MonetDB网站上的一些文档,并承认处于看似陡峭的学习曲线的底部。

MonetDBLite文档列出了一些函数,书面警告说它们并不是真正意味着直接调用。在R中使用MonetDB.R函数时,会出现一条警告,指出它已被弃用,请考虑使用MonetDBLite。

我的数据集大约有1亿行x 60个因子列,目前占用了30个已保存到rds文件的data.frames。我没有足够的内存来处理R中的整个内存,所以我想把它全部转储到MonetDB中,只提取特定任务所需的数据。

如果我为每个data.frame范例选择一个表,那么哪个R脚本将对MonetDB数据库中的所有表运行查询?我假设这是某种类型的JOIN。可以通过CREATE VIEW完成吗?

如果我选择一个大表范例,那么哪个R脚本允许我追加到现有的MonetDB表?

任何指导都将不胜感激。到目前为止,我已经能够拼凑出来了:

library( MonetDB.R )
library( MonetDBLite )
library( DBI )
library( digest )

dbDir <- 'myDirectory'

#
#   Create connection to database
#
conn  <- dbConnect( MonetDBLite(), dbDir )

#
#   Get data.table
#
f <- choose.files( default='directory to rds files', 
                       caption="select files for processing:",
                       multi=FALSE )

dt <- readRDS( file=f )

# extract file name without extension
tblName <- sub( "^([^.]*).*", "\\1", basename( f ) )

#
#   Add data.table to db
#
dbWriteTable( conn, tblName, dt )

#
#   Count rows
#
qryStr <- paste( "SELECT COUNT(*) FROM", tblName )
dbGetQuery( conn, qryStr )

#
#   After loading a few tables, stitch together into one view
#
viewStr <- "CREATE VIEW big_tbl AS
            SELECT * FROM (
                SELECT 'table1' AS type, table1.* FROM table1
                UNION ALL
                SELECT 'table2' AS type, table2.* FROM table2
                UNION ALL
                SELECT 'table3' AS type, table3.* FROM table3
            ) AS big_tbl_table"

dbGetQuery( conn, viewStr )

# dbListTables( conn )
#[1] "big_tbl" "table1"        
#[3] "table2" "table3"      

#
#   Get VIEW into R
#
library( dplyr )

mdb     <- src_monetdb( embedded=dbDir )
bigView <- tbl( mdb, 'big_tbl' ) # Error: select is not a character vector
bigView <- tbl( mdb, 'table1' )

#
#   Disconnect from db
#
dbDisconnect( conn )

1 个答案:

答案 0 :(得分:3)

所有小表都有相同的架构/列吗?在这种情况下,我会使用dbWriteTable()并将append标记设置为TRUE将它们全部放入一个大表中。