Один большой стол или много маленьких столов

Я прочитал посты MonetDB.R/MonetDBLite на этом сайте, PDF-файлы CRAN, а также некоторую документацию на сайте MonetDB и признаюсь, что оказался в нижней части того, что кажется крутой кривой обучения.

В документации MonetDBLite перечислено несколько функций с письменным предупреждением, что они на самом деле не предназначены для непосредственного вызова. При использовании функции MonetDB.R в R появляется предупреждение о том, что она устарела, и рассмотрите возможность использования MonetDBLite.

Мой набор данных составляет около 100 миллионов строк x 60 столбцов факторов, в настоящее время занимающих 30 фреймов данных, которые были сохранены в файлы rds. У меня недостаточно памяти для работы со всем этим в 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 ответ

Решение

Все ли маленькие таблицы имеют одинаковую схему / столбцы? В этом случае я бы положил их все в один большой стол, используя dbWriteTable() с append флаг установлен в TRUE,

Другие вопросы по тегам