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

jfe*_*aum 6 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的版本),但我想我不知道如何最好让 SQL 代码与dbplyr. 我很高兴尝试将该stringdist函数映射到 Jaro-Winklersql代码,但我不知道从哪里开始。但即使是更简单的事情,比如直接从 R 对远程数据执行 SQL 代码也会很棒。

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

Sim*_*.A. 5

您可以在 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"))
Run Code Online (Sandbox Code Playgroud)

这里的两个关键命令是:

  • sql_render,它采用 dbplyr 表并返回生成它的 SQL 代码
  • build_sql,它从字符串组装查询。

您可以选择执行命令:

  • tbl(connection, sql(sql_query))将返回结果表
  • dbExecute(db_connection, as.character(sql_query))将执行查询而不返回结果(对于删除表、创建索引等很有用)