在 R 編程語言中,我有興趣執行“模糊連接”并通過 SQL 連接傳遞它:
library(fuzzyjoin)
library(dplyr)
library(RODBC)
library(sqldf)
con = odbcConnect("some name", uid = "some id", pwd = "abc")
sample_query = sqlQuery( stringdist_inner_join(table_1, table_2, by = "id2", max_dist = 2) %>%
filter(date_1 >= date_2, date_1 <= date_3) )
view(sample_query)
但是,我認為這是不可能的,因為 Netezza 不支持我們用于“模糊連接”(stringdist_inner_join)的函式。
我試圖找到這個“模糊連接”函式的源代碼,并在這里找到它:https : //rdrr.io/cran/fuzzyjoin/src/R/stringdist_join.R
我的問題:有誰知道是否可以(手動)將此“模糊連接”函式轉換為 Netezza 可識別的 SQL 格式?有什么快速的方法可以重寫這個函式 (stringdist_inner_join) 以便 Netezza 可以識別它?是否有任何預先存在的方法來做到這一點?
現在我只能在本地執行“sample_query”——重寫這個函式(stringdist_inner_join)可以讓“sample_query”執行得更快。
有誰知道這是否可能?
筆記:
我的資料如下所示:
table_1 = data.frame(id1 = c("123 A", "123BB", "12 5", "12--5"), id2 = c("11", "12", "14", "13"),
date_1 = c("2010-01-31","2010-01-31", "2015-01-31", "2018-01-31" ))
table_1$id1 = as.factor(table_1$id1)
table_1$id2 = as.factor(table_1$id2)
table_1$date_1 = as.factor(table_1$date_1)
table_2 = data.frame(id1 = c("0123", "1233", "125 .", "125_"), id2 = c("111", "112", "14", "113"),
date_2 = c("2009-01-31","2010-01-31", "2010-01-31", "2010-01-31" ),
date_3 = c("2011-01-31","2010-01-31", "2020-01-31", "2020-01-31" ))
table_2$id1 = as.factor(table_2$id1)
table_2$id2 = as.factor(table_2$id2)
table_2$date_2 = as.factor(table_2$date_2)
table_2$date_3 = as.factor(table_2$date_3)
uj5u.com熱心網友回復:
根據您關于此問題的其他帖子,解決了如何構建 SQL 查詢的問題的解決方案:
SAS:模糊連接
select a.*, b.*
from table_a a
inner join table_b b
on (a.date_1 between b.date_2 and b.date_3)
and (le_dst(a.id1, b.id1) = 1 or a.id2 = b.id2)
為了讓它在 R 腳本中運行,我建議使用dbplyr并使用創建它,tbl以便您可以繼續對其進行基本操作,就好像它是一個 data.frame 并且 dbplyr 將其轉換為 SQL(至少是基本命令),然后將所有內容組合到一個查詢中,并最終使用該collect()函式從查詢中提取資料。
編輯:請注意,該tbl命令將開始構建 SQL 陳述句并獲取列名,但在您輸入之前不會運行它來提取資料collect(),R 會將查詢發送到服務器,服務器將運行查詢并發送資料。
請記住這一點,因為如果 dbplyr 無法將某些內容轉換為 SQL,它會假定它是一個 SQL 命令并嘗試發送它,因此您在嘗試收集之前不會知道有錯誤。例如,從一個功能stringr包,str_dectect,不執行dbplyr,因此dbplyr將發送命令到資料庫,這將拋出一個錯誤,因為它不知道那是什么,但只運行后collect()。查看上面鏈接的 dbplyr 頁面了解詳細資訊。
library(dbplyr)
new_con<- dbConnect(
odbc(),
Driver= "ODBC Driver 17 for SQL Server (as an example)",
Server = "Server name here",
uid = "some_id",
pwd = "abc"
)
sample_query<- dbplyr::tbl(
new_con,
dbplyr::sql(
"select a.*, b.*
from table_a a
inner join table_b b
on (a.date_1 between b.date_2 and b.date_3)"
sample_data<-sample_query %>%
filter(silly_example==TRUE) %>%
collect()
uj5u.com熱心網友回復:
我同意@Roger-123 的方法。但這里有一個可能有幫助的變體:
假設您使用遠程連接訪問 Netezza 資料庫,您可以使用 dbplyr 執行此操作,如下所示:
remote_1 = tbl(con, "table_1_name")
remote_2 = tbl(con, "table_2_name")
# create dummy column
remote_1 = mutate(remote_1, ones = 1)
remote_2 = mutate(remote_2, ones = 1)
output = remote_1 %>%
# cross_join
inner_join(remote_2, by = "ones", prefix = c("_1","_2")) %>%
# calculate Levenshtein distance
mutate(distance = le_dst(id1, id2)) %>%
# filter to close matches
filter(distance <= 2)
筆記:
- dbplyr 不允許在其連接中使用復雜的條件。因此,我們盡可能進行最通用的連接,然后進行過濾。
- 如果您還想按日期連接,那么您可以將它們放入
inner_join條件簡單的條件中,或者如果條件復雜則創建另一個過濾條件。 le_dst不是 R 函式,并且沒有針對它的 dbplyr 轉換,因此 dbplyr 將按原樣將其傳遞給服務器。- Netezza 接受兩個文本距離函式:
le_dst和dle_dst。你可以在這里隨意使用。 Output是一個查詢,它將像一個表一樣運行,但它是動態生成/計算的。它尚未寫入磁盤或加載到 R 記憶體中。根據您的應用程式,您將要存盤/保存它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/394463.html
