Как фильтровать типы столбцов с помощью Implyr - PullRequest
0 голосов
/ 09 октября 2019

Я использую 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"

спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...