我正在使用 MonetDBLite R 包来创建 MonetDB。我可以使用此处的说明创建数据库表,代码如下:
library(DBI)
library(MonetDBLite)
# Write tsv file of mtcars
write.table(mtcars, "mtcars.tsv", row.names=FALSE, sep= "\t")
# Initialize MonetDB
dbdir <- "/Users/admin/my_directory"
con <- dbConnect(MonetDBLite::MonetDBLite(), dbdir)
# Write table
dbWriteTable(con, "test4", "mtcars.tsv", delim="\t")
以下查询给出
> dbGetQuery(con, "SELECT * FROM test4 LIMIT 3")
mpg cyl disp hp drat wt qsec vs am gear carb
1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
到目前为止,一切都很好。但是,假设我有另一个文件 mtcars2 具有不同的 mpg 值:
mtcars2 <- mtcars
mtcars2$mpg <- mtcars2$mpg + 5
write.table(mtcars2, "mtcars2.tsv", row.names= FALSE, sep = "\t")
我可以将它加载到另一个表:
dbWriteTable(con, "test5", "mtcars2.tsv", delim = "\t")
> dbGetQuery(con, "SELECT * FROM test5 LIMIT 3")
mpg cyl disp hp drat wt qsec vs am gear carb
1 26.0 6 160 110 3.90 2.620 16.46 0 1 4 4
2 26.0 6 160 110 3.90 2.875 17.02 0 1 4 4
3 27.8 4 108 93 3.85 2.320 18.61 1 1 4 1
也很好。但我的问题是:我想稍后mpg
用 6 查找所有汽车cyl
,并知道它来自哪个数据集(mtcars 或 mtcars2)。根据我对 SQL 索引的了解(这不是很多,基本上我在这里读过的内容),我应该将所有数据放在一个表中以进行最有效的搜索。我尝试加载第一个 tsv 文件,然后使用 sql 命令添加另一ALTER TABLE test4 ADD dataset TEXT
列UPDATE test4 SET dataset = dataset1
-
dbSendQuery(con, "UPDATE test4 SET dataset = dataset1")
dbSendQuery(con, "UPDATE test4 SET dataset = 1")
> dbGetQuery(con, "SELECT * FROM test4 LIMIT 3")
mpg cyl disp hp drat wt qsec vs am gear carb dataset
1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 1
2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 1
3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 1
但是当我尝试将 mtcars2 附加到表时,它有不同数量的列(正如我应该预料的那样,duh)。将许多具有相同列的 tsv 文件中的数据连接到一个表中,同时跟踪数据源的最佳方法是什么?
编辑——你可能已经猜到了,真正的数据不是 mtcars——它是数百万行长的平面 tsv 文件,这意味着我想避免将整个文件读入内存并使用 R 进行操作。