Я использую implyr, пакет R, который я использую для запроса кластера Cloudera Hadoop с импалой в качестве механизма запросов.
Я хочу извлечь имена всех числовых столбцов. В настоящее время я использую медленный взлом, - я извлекаю (собираю) одну строку данных и фильтрую по ней, как показано ниже:
num_cols <- table_query %>% # some query
head(1) %>% # take first row
collect %>% # collect results from database and store locally
Filter(is.numeric,x = .) %>% # get numeric columns
colnames # get column names
Я также пробовал select_if
, что быстро для отдельных таблиц,но еще медленнее для моего конкретного запроса (который включает в себя объединения и т. д.):
num_cols <- table_query %>% # some query
select_if(is.numeric) %>% # get all numeric columns
colnames # get column names
Есть ли в любом случае я могу сделать это на "стороне базы данных" и избежать использования оператора сбора? Например, если мне просто нужны все имена столбцов, я могу получить это намного быстрее, не используя «collect ()».
all_cols <- table_query %>% colnames
Я попытался получить класс отдельных столбцов (думая, что мог бы сделатьцикл) без удачи:
> table_query %>% select(column_1) %>% class()
[1] "tbl_impala" "tbl_sql" "tbl_lazy" "tbl"
и просто получение одного элемента и получение класса этого, также не повезло:
> table_query %>% select(column_1) %>% .[1] %>% class
[1] "list"
> table_query %>% select(column_1) %>% head(1) %>% class
[1] "tbl_impala" "tbl_sql" "tbl_lazy" "tbl"
В общем, я мог бы получить классстолбцы легко, тогда я мог бы фильтровать таким образом (но я не уверен, как это сделать!). Когда я пишу запрос в консоли, я получаю столбцы классов:
> table_query
# Source: lazy query [?? x 83]
# Database: impalad version 2.10.0-cdh5.13.3 through odbc [/schema]
column_1 column_2 column_3
<dbl> <chr> <chr>
1 201901-31 eggs sky
2 201935 fish earth
3 201631 cats wind
Дополнительные примечания
table_query
- это запрос к таблице, написанной в implyr,например,
library(implyr)
library(tidyverse)
connection_object <- implyr::src_impala(drv = odbc::odbc(). # connection object to db
,HOST="blah.blah.blah"
,...)
table <- tbl(connection_object, table_in_database) # connect to table
table_query <- table %>% # example query
select(column_1, column_2, column_3) %>%
filter(column_2 %in% c(1,2,3))
В приведенном выше примере, если column_1
является числовым, а остальные строки, то мои результаты должны быть:
> all_cols
[1] "column_1" "column_2"
[3] "column_3"
> num_col
[1] "column_1"
спасибо!