首页 > 解决方案 > 创建 Clickhouse 数据库并使用 R 加载大量表

问题描述

我正在尝试创建一个 Clickhouse 数据库并将许多文件中的值复制到一个表中(所有这些文件的列顺序相同)。

但我不明白如何处理它。

我正在使用RClickhouse,我不知道与clickhouse-r相比是否有任何区别。

library(RClickhouse)
library(DBI)
library(tidyverse)

eggnog_dir <- "/home/acpguedes/projects/sig_trans/data/eggnog/table/"
setwd(eggnog_dir)

myconn <- DBI::dbConnect(drv = RClickhouse::clickhouse())

mytables <- list.files(".") # all tables are in the same folder 

mysqltb <- db_create_table(con = myconn, table = 'eggnog')


lapply(mytables, function(x) {
  read_tsv(file = x, 
           col_names = c( #in my case the tables has no header
             'sequence',
             'model',
             'start',
             'end',
             'evalue',
             'cov',
             'qstart',
             'qend',
             'iteration',
             'score',
             'talilen',
             'qlen',
             'estart',
             'eend',
             'program'
             )
           ) %>% dbWriteTable(conn=myconn, value = ., name = "domains", append=TRUE) 
  }
    ) -> dt

列本身无关紧要,我只是想要一个如何创建表并将许多文件的内容加载到其中的示例(tsv ou CSV 或任何 delim 之类的表)。

我也尝试过dbpĺyrusing 。copy_to()dbWriteTable

此外,在加载所有表后,我是否应该执行“提交”语句以将数据库永久保存到 R 或其他平台的后续访问?

提前致谢。

标签: sqlrdbiclickhousedbplyr

解决方案


鉴于您无法在 R 外部或重新启动后读取表,听起来问题正在提交给数据库。

在 之后尝试以下操作lapply

my_commit_statement = "COMMIT"
dbExecute(myconn, my_commit_statement)

为您的应用程序使用适当的提交语句。

另一种(不太可能)的可能性是表创建或写入是临时的。dbCreateTableDBI 包和dbWriteTable来自 DBI 包的参数都具有temporary默认值FALSE,因此这不应该是原因。但是明确说明这一论点并没有什么坏处,因为这样temporary = TRUE可以使您的表无法持久化。db_create_table还值得检查您正在使用的与dbCreateTableDBI 包之间是否有任何区别。


推荐阅读