Я отправляю запрос на VERTICA(SQL)
, используя пакет R ODBC
.Я ищу быстрое решение, которое выберет все ненулевые столбцы из таблицы A и поместит их в новую таблицу B.
Я создал и функционирую, что, на мой взгляд, крайне неэффективно, но я незнать, как сделать это быстрее.Функция принимает максимальное значение для каждого столбца в таблице и выбирает его, если MAX
не равно нулю.Помещение всего в один запрос не сильно изменится, потому что Vertica
- это база данных столбцов.
reduce_width <- function(in_name, out_name) {
query_in <- paste('SELECT * FROM', in_name, 'LIMIT 1;', sep = ' ')
vertica_answer <- dbGetQuery(conn, query_in)
var_names <- colnames(vertica_answer)
lenght <- length(var_names)
var_names <- as.data.frame(var_names, stringsAsFactors = F)
var_names$is_null <- 0
for(i in 1:lenght){
name <- as.character(var_names[i,1])
query_max <- paste('SELECT MAX(',name,') from', in_name,';', sep = ' ')
max_value <- dbGetQuery(conn, query_max)
if(is.na(max_value[1,1])){
var_names$is_null[i]<-0
} else {
var_names $is_null[i]<-1
}
}
not_null_collumns <-var_names %>% filter(is_null==1) %>% select(var_names)
not_null_collumns <- (as.character(t(not_null_collumns$var_names)))
query_front <- 'SELECT'
for(i in 1:(length(not_null_collumns)-1)) {
query_front <- paste(query_front, not_null_collumns[i],',', sep = ' ')
}
query_front <- paste(query_front,
not_null_collumns[length(not_null_collumns)], sep = ' ')
query_back <- paste('into', out_name, 'from', in_name , sep = ' ')
query_create <- paste(query_front, query_back, sep = ' ')
dbSendQuery(conn, query_create)
}
Как мне ускорить решение?