2016-10-05 10 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'を使用しているのであれば、それをオブジェクトやメモリに使用しています。言いましたが、あなたは 'dplyr'で任意のSQLを使うことができます。 'tbl(my_db_extract_now_in_memory、sql(" SELECT * FROM flights "))'が、常にメモリに格納されます。 –

+0

私はこれを厳密にdplyrを使ってやろうとしています。 '' collect() 'がトリガーするまで、怠惰はそれらをメモリに持ち込むべきではありません。 –

+0

'dplyr'ですべてのことを行うのは問題ありませんが、一旦抽出されるとメモリに残ると言っています。これは違いがないことに注意してください。そして、RODBCのような他の方法でDBを通してRに問い合わせてください。あなたが 'RPostgres'や' RODBC'などを使ってSQLクエリを送信し、それをデータベース*内に新しいテーブル*を作成するために使用しただけで、データをRにエクスポートしなかった場合、メモリにない方法があります –

答えて

1

あなたはdplyrで任意のSQLを使用することができます。

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

注これは、RODBCによるなど、任意の他の手段を介してRを介してDBを照会よりも違いはありません。

もちろん、抽出されたデータは、クエリを介してRにインポートされると、メモリ内に常にとなります。たとえば、RPostgresまたはRODBCなどを使用してSQLクエリを送信し、それをデータベース内に新しいテーブルを作成するために使用し、データをRにエクスポートしなかった場合は、メモリには絶対に格納されません。

+0

はい、私はdplyrでこれをやろうとしているので、1つの言語しか使用できません。 'このようなものがdplyrでメモリに引き込まれることなくどのように複製されるのですか? ' –

+0

@PhillipBlackどういうことを言っていますか?私の答え**のコードは** 'dplyr'です。私はあなたの質問に答えて、それをメモリに取り込まずに行いました。私が言ったように、あなたは私の例のように 'dplyr'の中で任意のSQLを使います。 '?tbl'を見て、ファインマニュアル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) 
)