Как использовать пользовательскую функцию SQL в dbplyr? - PullRequest
0 голосов
/ 03 июня 2018

Я хотел бы рассчитать расстояние строки Джаро-Винклера в базе данных.Если я перенесу данные в R (с collect), я легко смогу использовать функцию stringdist из пакета stringdist.

Но мои данные очень большие, и я хотел бы отфильтровать их на Jaro-Уинклер расстояния до вытягивания данных в R.

Есть код SQL для Jaro-Winkler (https://androidaddicted.wordpress.com/2010/06/01/jaro-winkler-sql-code/ и версия для T-SQL ) но я не уверен, как лучше заставить этот код SQL работать с dbplyr.Я счастлив попробовать сопоставить функцию stringdist с кодом Jaro-Winkler sql, но я не знаю, с чего начать.Но даже что-то более простое, например, выполнение кода SQL непосредственно из R для удаленных данных, было бы замечательно.

Я надеялся, что перевод SQL в документации dbplyr может помочь, но я нене думаю.

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете создавать свои собственные функции SQL в R. Они просто должны создать строку, которая является допустимым запросом SQL.Я не знаю расстояния Джаро-Винклера, но могу привести пример для построения:

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)) выполнит запрос без возврата результата (полезно для удаления таблиц, создания индексов и т. Д.)
...