6

我想计算数据库中的 Jaro-Winkler 字符串距离。如果我将数据带入 R (with 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可能会有所帮助,但我不这么认为。

4

3 回答 3

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"))

这里的两个关键命令是:

  • sql_render,它接受一个 dbplyr 表并返回生成它的 SQL 代码
  • build_sql,它从字符串中组装一个查询。

您可以选择执行命令:

  • tbl(connection, sql(sql_query))将返回结果表
  • dbExecute(db_connection, as.character(sql_query))将执行查询而不返回结果(用于删除表、创建索引等)
于 2018-09-18T20:40:47.137 回答
0

或者,找到一种将 SQL 中的函数定义为用户定义函数的方法,然后您可以简单地使用该函数的名称,就好像它是一个 R 函数(在 dbplyr 查询中)。当 R 在本地找不到该函数时,它只是将其传递给 SQL 后端并假定它是 SQL 领域中可用的函数。

这是解耦逻辑的好方法。不利的一面是 dbplyr 表达式现在依赖于 db-backend;您无法在本地数据集上运行附带的代码。一种解决方法创建一个模仿现有 R 函数的 UDF。将dplyr使用本地 Rdbplyr并将使用 SQL UDF。

于 2022-01-12T23:13:17.130 回答
0

您可以使用sql()which 运行您提供的任何原始 SQL。

例子

这里的 lubridate 等效项在数据库后端不起作用。

因此,我将自定义 SQL 代码sql("EXTRACT(WEEK FROM ildate)")放入其中sql(),如下所示:

your_dbplyr_object %>%
  mutate(week = sql("EXTRACT(WEEK FROM meeting_date)"))
于 2022-02-04T15:34:42.980 回答