Я прочитал сообщения MonetDB.R/MonetDBLite на этом сайте, CRAN-файлы PDF, а также часть документации на сайте MonetDB и признаюсь, что это внизу того, что появляется быть крутой кривой обучения.Один большой стол или много меньших таблиц
Документация MonetDBLite перечисляет несколько функций с письменным предупреждением о том, что они на самом деле не предназначены для прямого вызова. При использовании функции MonetDB.R в R появляется предупреждение о том, что оно устарело, и, пожалуйста, рассмотрите возможность использования MonetDBLite.
Мой набор данных составляет около 100 миллионов строк х 60 столбцов факторов, которые в настоящее время занимают 30 data.frames, которые были сохранены в 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)
У всех маленьких таблиц есть одна и та же схема/столбцы? В этом случае я поместил бы их все в одну большую таблицу с помощью 'dbWriteTable()' с флагом 'append', установленным в' TRUE'. –
@ Ханнес - Отлично, это именно то, что мне нужно было двигаться вперед. Спасибо! –
@Hannes - Если вы создадите ответ, я помечаю его как решенный. Еще раз спасибо. –