R语言dbplyr包实现R与SQL语句无缝衔接

注:并不支持所有R函数语句转换为SQL,例如:dplyr包的with_groups

1、cop_to函数

适用于少量数据复制到数据库(通常创建为临时表),然后使用R语句计算并转换为SQL语句;

不建议直接复制数据到库再进行操作,大量数据复制会耗费较长时间,使用src_memdb将极大节省时间(并不会创建新的数据在R中,而是存储在src_memdb)。

copy_to(
  src_x,#远程数据源链接,例如src_postgres,src_sqlite
  df,#需要复制的数据
  name = deparse(substitute(df)),#复制到库中的名字
  overwrite = FALSE,#是否为复写
  temporary = TRUE,#是否创建为临时表
)
#将数据复制到src_memdb中
test_data_db <- copy_to(src_memdb(),df=test_data,temporary=TRUE,overwrite=TRUE)

#新的的数据计算方法无缝转换为SQL语句
test_data_db %>%mutate(date_change=as_date(var1)) %>% 
  filter(date_change>="value") %>% 
  group_by(var2) %>% summarise(num=n_distinct(var3)) %>%
  show_query()
#转换结果
SELECT `var2`, COUNT(DISTINCT `var3`) AS `num`
FROM (SELECT `var2`, `var4`, `var3`, `var5`, `var1`, `var6`, CAST(`var1` AS DATE) AS `date_change`
FROM `test_data`)
WHERE (`date_change` >= 'value')
GROUP BY `var2`

2、memdb_frame、tbl_memdb函数

作用与copy_to相同,直接创建存储至src_medb

iris_db <- tbl_memdb(iris)

iris_db %>% group_by(Species) %>% 
  summarise(across(everything(),list(max=max,min=min,median=median))) %>% 
  show_query()
#输出结果
SELECT `Species`, MAX(`Sepal.Length`) AS `Sepal.Length_max`, MIN(`Sepal.Length`) AS `Sepal.Length_min`, MEDIAN(`Sepal.Length`) AS `Sepal.Length_median`, MAX(`Sepal.Width`) AS `Sepal.Width_max`, MIN(`Sepal.Width`) AS `Sepal.Width_min`, MEDIAN(`Sepal.Width`) AS `Sepal.Width_median`, MAX(`Petal.Length`) AS `Petal.Length_max`, MIN(`Petal.Length`) AS `Petal.Length_min`, MEDIAN(`Petal.Length`) AS `Petal.Length_median`, MAX(`Petal.Width`) AS `Petal.Width_max`, MIN(`Petal.Width`) AS `Petal.Width_min`, MEDIAN(`Petal.Width`) AS `Petal.Width_median`, MAX(`Species`) AS `Species_max`, MIN(`Species`) AS `Species_min`, MEDIAN(`Species`) AS `Species_median`
FROM `iris`
GROUP BY `Species`

3、remote_x一类函为数据库中的类似函数操作

例如:remote_query函数—查看数据库中R语句的SQL查询语句

remote_query_plan函数—查看语句的执行计划

4、tbl_lazy、lazy_frame函数

转换原有数据,无需实际连接数据库,直接可转换后生成SQL,并提供了多种数据库后端simiulate_数据库简称(MySQL/MariaDB,ODBC,Oracle,PostgreSQL,Redshift等)可供转换成对应的库的函数查询语句

iris_db <-lazy_frame(iris,con=simulate_mysql())

iris_db %>%group_by(Species) %>% tally() %>% show_query()
#输出结果:
SELECT `Species`, COUNT(*) AS `n`
FROM `df`
GROUP BY `Species`

你可能感兴趣的:(R语言,实用随笔,r语言,数据库,sql,dbplyr)