2016-04-29 3 views
2

Я прочитал сообщения 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) 
+0

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

+0

@ Ханнес - Отлично, это именно то, что мне нужно было двигаться вперед. Спасибо! –

+0

@Hannes - Если вы создадите ответ, я помечаю его как решенный. Еще раз спасибо. –

ответ

3

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

+0

Привет Ханнес, просто быстрый вопрос: оставите ли столбцы data.tables в качестве факторов или преобразуете их в символ (3 столбца), целое число (12 столбцов) и числовое (43 столбца), прежде чем записывать их в MonetDB? Тест db, заполненный преобразованными столбцами, почти в 2 раза больше, чем тот же db, заполненный только факторами. При загрузке в таблицу MonetDB столбцы факторов берут тип данных CLOB, который я ожидал (по-видимому, ошибочно), чтобы требовать больше байтов, чем целые числа и удваивает. Я бы хотел использовать самый безопасный метод с максимально возможным сжатием на диске. –

+0

Факторы преобразуются в любом случае при вставке. –

 Смежные вопросы

  • Нет связанных вопросов^_^