如何在dbplyr中使用自定义SQL函数?

时间:2018-06-02 22:57:07

标签: r stringdist dbplyr

我想计算数据库中的Jaro-Winkler字符串距离。如果我将数据带入R(使用collect),我可以轻松使用stringdist包中的stringdist函数。

但是我的数据非常大,我想在将数据拉入R之前过滤Jaro-Winkler距离

有Jaro-Winkler的SQL代码(https://androidaddicted.wordpress.com/2010/06/01/jaro-winkler-sql-code/T-SQL的版本),但我想我不确定如何最好地使用{{1的SQL代码}}。我很乐意尝试将dbplyr函数映射到Jaro-Winkler stringdist代码,但我不知道从哪里开始。但即使是在远程数据上直接从R执行SQL代码这样简单的事情也会很棒。

我曾希望sql文档中的SQL translation可能有所帮助,但我不这么认为。

1 个答案:

答案 0 :(得分:0)

您可以在R中构建自己的SQL函数。它们只需要产生一个有效的SQL查询字符串即可。我不知道Jaro-Winkler距离,但是我可以为您提供一个示例,供您参考:

union_all = function(table_a,table_b, list_of_columns){
  # extract database connection
  connection = table_a$src$con

  sql_query = build_sql(con = connection,
                      sql_render(table_a),
                      "\nUNION ALL\n",
                      sql_render(table_b)
  )

  return(tbl(connection, sql(sql_query)))
}

unioned_table = union_all(table_1, table_2, c("who", "where", "when"))

这里的两个关键命令是:

  • sql_render,它将使用dbplyr表并返回产生该表的SQL代码
  • build_sql,它从字符串中组合查询。

您可以选择执行命令:

  • tbl(connection, sql(sql_query))将返回结果表
  • dbExecute(db_connection, as.character(sql_query))将在不返回结果的情况下执行查询(可用于删除表,创建索引等)