【问题标题】:Create Table from SQL statement using dplyr使用 dplyr 从 SQL 语句创建表
【发布时间】:2020-11-25 12:34:20
【问题描述】:

目前我正在使用 dplyr 和 dplyr.snowflakedb 来操作 Snowflake 中的一些数据。

虽然这个解决方案被证明可以很好地查询数据,但我面临着一个挑战:

此解决方案是否可以使用字符串 sql 语句?即创建表?

也就是说我可以使用字符"CREATE TABLE my_table AS select * from table 1"在数据库中生成一个新表吗?

提前致谢

【问题讨论】:

    标签: r dplyr snowflake-cloud-data-platform


    【解决方案1】:

    您可以使用dbplyr::sql_render() 将远程tibble 转换为SQL 查询,然后将其与glue::glue_sql() 粘合在一起,如下所示:

    # Create an ephemeral in-memory RSQLite database
    conn <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")
    dplyr::copy_to(conn, mtcars, overwrite = TRUE)
    
    
    remote_tbl <- dplyr::tbl(conn, 'mtcars')
    remote_tbl
    #> # Source:   table<mtcars> [?? x 11]
    #> # Database: sqlite 3.30.1 [:memory:]
    #>      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
    #>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    #>  1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
    #>  2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
    #>  3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
    #>  4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
    #>  5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
    #>  6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
    #>  7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
    #>  8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
    #>  9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
    #> 10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
    #> # … with more rows
    
    modified_tbl <- remote_tbl %>% 
      dplyr::select(cyl)
    
    
    
    select_query <- dbplyr::sql_render(modified_tbl)
    table <- 'mtcars2'
    
    insert_statement <- glue::glue_sql(
        "create table {`table`} as {DBI::SQL(select_query)}",
        .con = conn
      )
    DBI::dbExecute(conn, insert_statement)
    #> [1] 0
    DBI::dbListTables(conn)
    #> [1] "mtcars"       "mtcars2"      "sqlite_stat1" "sqlite_stat4"
    

    reprex package (v0.3.0) 于 2020 年 11 月 25 日创建

    一般来说,{dplyr} 的设计目的不是写回任何内容或更新表。 {dm} 可能会占据这个位置。考虑 {dm} 包的最新发展,特别是插入时的 this vignette。

    【讨论】:

      猜你喜欢
      • 2021-01-08
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2011-04-09
      • 2010-09-16
      • 2021-09-05
      • 2014-01-20
      • 1970-01-01
      相关资源
      最近更新 更多