2016-10-05 3 views
0

Рассмотрим следующий SQL:dplyr SQL присоединяется

SELECT D.product_name 
     FROM business.payment P 
LEFT JOIN dim.product_name D 
     ON D.product_id = P.product_id 

Запрос возвращает список product_names, которые находятся в таблице выплат и делает это на основе объединения.

Как можно было бы воспроизвести что-то подобное в dplyr, не вдаваясь в память? Я работаю с подключением к базе данных.

Я попытался следующие, но безрезультатно:

product_name <- 
    business %>% 
    tbl('dim_product') 

business %>% 
    tbl('payment') %>% 
    left_join(product_name, by = 'product_id') %>% 
    select(product_name) %>% 
    collect() 

Я искал довольно большой, и никто, кажется, не обратился к этому.

Спасибо!

+1

R хранит все объекты в памяти. Поэтому, если вы используете 'dplyr', вы используете его на объектах и, следовательно, в памяти. Сказав это, вы можете использовать произвольный SQL в 'dplyr', например. 'tbl (my_db_extract_now_in_memory, sql (« SELECT * FROM flight »))', но это всегда будет в памяти. –

+0

Я пытаюсь сделать это строго с помощью dplyr. Лень не должна приводить их в память до триггеров 'collect(). –

+0

Выполнение всего этого в 'dplyr' - это не проблема, но я просто говорю, что он будет в памяти после его извлечения. Обратите внимание, что это ничем не отличается от запроса DB через R с помощью любых других средств, таких как 'RODBC'. Единственный способ, которым он не был в памяти, - это использовать «RPostgres» или «RODBC» и т. Д. Для отправки SQL-запроса и просто использовать его для создания новой таблицы * в базе данных * и никогда не экспортировал данные в R –

ответ

1

Вы можете использовать произвольный SQL в dplyr:

tbl(my_data, sql("SELECT * FROM flights")) 

Примечание это не отличается от запросов к БД через R с помощью любых других средств, например, путем RODBC.

Конечно, извлеченные данные будут всегда быть в памяти после его импорта в R по запросу. Единственный способ, которым он не был бы в памяти, - это если вы использовали RPostgres или RODBC и т. Д., Чтобы отправить запрос SQL и просто использовали его для создания новой таблицы в базе данных и никогда не экспортировали данные в R.

+0

Да, но я пытаюсь сделать это с помощью dplyr, поэтому я могу использовать только один язык. 'Как бы что-то подобное было реплицировано в dplyr, не вдаваясь в память?' –

+0

@PhillipBlack О чем вы говорите? Код в моем ответе ** является ** 'dplyr', и я ответил на ваш вопрос относительно его выполнения, не вытаскивая его в память. Как я уже сказал, вы используете произвольный SQL в 'dplyr', как в моем примере. См. «? Tbl» и «Чистое руководство» https://cran.r-project.org/web/packages/dplyr/dplyr.pdf и https://cran.r-project.org/web/packages/dplyr/ виньетки/баз данных.html –

+0

@PhillipBlack Итак, напомним, что, как вы упомянули, 'dplyr' может ждать до последней секунды через лень, т. е. он только вытаскивает окончательный отрывок (а не промежуточные таблицы) в память, что и есть то, что происходит в коде в моем ответ. Абсолютно ничего не нужно втягивать в память, тогда (очевидно) единственным решением является использование «RODBC» или любого подобного пакета для запроса ваших данных в новую созданную таблицу в вашей БД, таким образом, обходя R полностью. –

0

Это время после факта, но, возможно, вы все еще ищете или интересуетесь опцией dplyr на основе глагола. Я работал над тем же вопросом для своей работы и наткнулся на ваш (небезопасный) вопрос. Ниже работает для меня, когда я запускаю его в базе данных MSSQL с использованием пакетов DBI и odbc.

Я выбрал столбцы, представляющие интерес, из таблиц, прежде чем присоединяться, поскольку это, как правило, наилучшая практика при запросе баз данных. dplyr функции соединения будут выполнять естественное соединение по умолчанию, поэтому вам может не потребоваться явно указать аргумент by.

db_con <- DBI::dbConnect(
    drv = odbc::odbc(), 
    dsn = <data source name> 
) 

db_con %>% 
    tbl("table1") %>% 
    select(col1, col2, col3) 
    left_join(
    db_con %>% tbl("table2") %>% select(col3, col4, col5) 
) 
Смежные вопросы