首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用MonetDB和MonetDBLite组合R中的大型测量数据

无法使用MonetDB和MonetDBLite组合R中的大型测量数据
EN

Stack Overflow用户
提问于 2015-11-27 15:18:58
回答 1查看 449关注 0票数 2

我试图连接或重新绑定12年的调查数据,每一个数据都有几百万个观测数据和100个左右的变量,以便在统计调查结构的同时分析年度趋势。最近发布的MonetDBLite for R似乎是为这个大型数据集实现基于列的DBMS的一个很好的机会。不过,我在合并数据集方面遇到了困难。

简而言之,使用plyr::r.bind.fill对DBI:dbWriteTable返回一个截断的表。r.bind.fill是理想的,因为不同年份的数据集各不相同。使用dplyr::rbind_all似乎根本不起作用。一种不太有用的方法(但仍然可以接受)包括删除列,使表完全相同,并使用直接的UNION操作。但这会返回语法错误。

我对dplyr和MonetDB非常陌生,所以这肯定是由于我自己的无知,但是我花了几天的时间在没有运气的情况下浏览了网络,所以任何帮助都将是非常感谢的。

下面是一个可重复的例子。

干杯

查尔斯

代码语言:javascript
复制
# install.packages("MonetDB.R", repos="http://dev.monetdb.org/Assets/R/")
# install.packages("MonetDBLite", repos="http://dev.monetdb.org/Assets/R/")
library(MonetDBLite)
library(MonetDB.R)
library(dplyr)
library(plyr)
library(zoo)


mtcars1<-mtcars[,-11] # create 2 slightly different versions of mtcars
mtcars2<-mtcars[,-10]

mtcars1<-coredata(mtcars1)[rep(seq(nrow(mtcars1)),200000),] # create large versions of those dataframes
mtcars2<-coredata(mtcars2)[rep(seq(nrow(mtcars2)),200000),]

dbdir <- tempdir() # create a temporary directory
con <- dbConnect(MonetDB.R(), embedded=dbdir) # use DBI to connect to MonetDB

dbWriteTable(con, "mtcars1", mtcars1) #  write the dataframes to column-based MonetDB tables
dbWriteTable(con, "mtcars2", mtcars2) 
dbListTables(con)

ms <- src_monetdb(embedded=dbdir) # create a dplyr::tbl version tables
mt1 <- tbl(ms, "mtcars1") 
mt2<-tbl(ms, "mtcars2")

# try plyr::rbind.fill to concatenate tables
dbWriteTable(con, "mt_1_2", rbind.fill(as.data.frame(mt1, mt2)))

# Warning message:
# Only first 6,400,000 results retrieved. Use n = -1 to retrieve all.

dbGetQuery(con, "SELECT COUNT(*) FROM mt_1_2 " )
#      L1
# 1 1e+05

dbRemoveTable(con, "mt_1_2") # remove table to re-try

# try dbFetch(res, n=-1) to retrieve all results
dbFetch(dbWriteTable(con, "mt_1_2", rbind.fill(as.data.frame(mt1, mt2))), n=-1)

# Error in (function (classes, fdef, mtable)  :
#   unable to find an inherited method for function ‘dbFetch’ for signature ‘"logical", "numeric"’
# In addition: Warning message:
# Only first 6,400,000 results retrieved. Use n = -1 to retrieve all.

dbRemoveTable(con, "mt_1_2") # remove table to re-try

dbListFields(con, "mtcars1") # remove fields to make table columns identical
dbListFields(con, "mtcars2")

dbGetQuery(con, "
ALTER TABLE mtcars1
DROP COLUMN gear
")

dbGetQuery(con, "
ALTER TABLE mtcars2
DROP COLUMN carb
")

dbGetQuery(con,
    "CREATE TABLE mt_1_2 WITH 
    Select * FROM mtcars1
    UNION ALL
    Select * FROM mtcars2")


# Error in .local(conn, statement, ...) :
#   Unable to execute statement 'CREATE TABLE mt_1_2 AS
#   Select * FROM mtcars1
#   UNION ALL
#   Select * FROM mtcars2'.
# Server says 'syntax error, unexpected SCOLON, expecting WITH in: "create table mt_1_2 as
#   select * from mtcars1
#   union all
#   select * from mtcars2"
# ' [#42000].
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-27 17:49:13

您可以坚持使用dplyr并使用rbind_list

代码语言:javascript
复制
library(MonetDB.R)
library(MonetDBLite)
library(dplyr)

mtcars1 <- mtcars[, -11] # create 2 slightly different versions of mtcars
mtcars2 <- mtcars[, -10]

## Reduce size
mtcars1 <- mtcars1[rep(seq(nrow(mtcars1)), 10000), ]
mtcars2 <- mtcars2[rep(seq(nrow(mtcars2)), 10000), ]

### Check size
nrow(mtcars1)
## [1] 320000

nrow(mtcars2)
## [1] 320000

###
dbdir <- tempdir() ## create a temporary directory
con <- dbConnect(MonetDB.R(), embedded = dbdir)

###
dbWriteTable(con, name = "mtcars1", value = mtcars1)
dbWriteTable(con, name = "mtcars2", value = mtcars2)

dbListTables(con)

###
ms <- src_monetdb(embedded = dbdir) # create a dplyr::tbl version tables
mt1 <- tbl(ms, "mtcars1") 
mt2 <- tbl(ms, "mtcars2")

### You need to add `n = -1` to `as.data.frame` to retrieve all rows
dbWriteTable(con, "mt_1_2", rbind_list(as.data.frame(mt1, n = -1),
                                       as.data.frame(mt2, n = -1)))

###
dbGetQuery(con, "SELECT COUNT(*) FROM mt_1_2")
##       L1
## 1 640000
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33960368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档