2016-10-05 6 views
0

다음과 같은 SQL을 고려 합류했다.dplyr의 SQL은

어떻게 이런 일이 dplyr에서 메모리를 사용하지 않고 복제 될 수 있습니까? 데이터베이스 연결로 작업하고 있습니다. 나는 아주 큰 검색 한 아무도이 문제를 해결 한 것 같다

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

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

:

은 내가하지만 아무 소용이 다음 시도했다.

감사합니다.

+1

R은 메모리에 모든 개체를 저장합니다. 그래서 만약 당신이'dplyr'을 사용한다면 여러분은 객체와 메모리에 그것을 사용하고 있습니다. 그렇다면'dplyr'에서 임의의 SQL을 사용할 수 있습니다. 'tbl (my_db_extract_now_in_memory, sql ("SELECT * FROM flights"))'하지만 항상 기억에 남을 것입니다. –

+0

dplyr을 사용하여이 작업을 엄격하게 수행하려고합니다. 게으름은'collect()'가 나타날 때까지는 메모리에 가져 오면 안됩니다. –

+0

'dplyr'에서 모든 것을 수행하는 것은 아무런 문제가되지 않지만 압축이 풀린 후에는 메모리에있을 것이라고 말하고 있습니다. 이것도 다르지 않다. RODBC와 같은 다른 방법을 통해 DB를 질의한다. 한가지 방법은'RPostgres' 나'RODBC' 등을 사용하여 SQL 질의를 보내고 데이터베이스 * 내에서 새 테이블을 만들 때 * 사용한 적이 없으며 데이터를 R로 내 보낸 적이 없다는 것입니다 –

답변

1

당신은 dplyr에 임의의 SQL을 사용할 수 있습니다

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

참고이는 RODBC에 의해 같은 다른 수단을 통해 R을 통해 DB를 조회 다르지 않다.

물론 추출한 데이터는 쿼리를 통해 R로 가져온 후에는 항상이됩니다. 하나의 방법으로 메모리에 전혀 없다면 RPostgres 또는 RODBC 등을 사용하여 SQL 쿼리를 보내고 데이터베이스 내에서 새 테이블을 만들었고 데이터를 R로 내 보내지 않았을뿐입니다.

+0

예,하지만 dplyr을 사용하여이 작업을 수행하려고하고 있으므로 하나의 언어 만 사용할 수 있습니다. '어떻게 이런 일이 dplyr에서 메모리로 끌어 오지 않고 복제 될 수 있습니까? ' –

+0

@PhillipBlack 무슨 말씀 이세요? 내 대답 **에있는 코드는 **'dplyr'이고 나는 그것을 메모리에 넣지 않고 수행하는 것에 관한 귀하의 질문에 답변했습니다. 앞서 말했듯이, 나의 예제에서와 같이'dplyr' 내에서 임의의 SQL을 사용합니다. '? tbl'을보고 Fine Manual https://cran.r-project.org/web/packages/dplyr/dplyr.pdf와 https://cran.r-project.org/web/packages/dplyr/을 읽으십시오. 비 네트/데이터베이스.html –

+0

@PhillipBlack 그래서'dplyr'가 게으름을 통해 마지막 초까지 기다릴 수 있다고 언급했듯이, 중간 추출물이 아닌 최종 추출물 만 메모리에 가져옵니다. 즉, 대답. 메모리에 끌어 들여지는 것이 절대적으로 없다면, 유일한 솔루션은'RODBC' 또는 유사한 패키지를 사용하여 DB 내의 새로운 테이블에 데이터를 쿼리하여 R을 완전히 우회하는 것입니다. –

0

이것은 잠시 후에 사실이지만 dplyr 동사를 기반으로하는 옵션을 찾고 있거나 호기심을 갖고 있습니다. 저는 제 일을 위해 같은 문제에 대해 일하고 있었고 당신의 대답없는 대답을 보았습니다. 아래는 DBIodbc 패키지를 사용하는 MSSQL 데이터베이스에 대해 실행할 때 작동합니다.

일반적으로 데이터베이스를 쿼리 할 때 조인하기 전에 테이블에서 원하는 열을 선택했습니다. 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) 
)