我在哪里执行的R脚本的存储过程,并返回一个数据帧作为输出。该程序将查询链接的服务器,执行各种对原始查询的结果的变换,并返回生成的数据帧。
下面是我的环境的详细信息:
Product: Microsoft SQL Server Enterprise (64-bit)
Operating System: Microsoft Windows NT 6.3 (9600)
Platform: NT x64
Version: 13.0.5216.0
在存储过程中的脚本如下:
EXECUTE sp_execute_external_script
@language = N'R',
@script = N'
library(jsonlite)
library(purrr)
library(tidyr)
library(dplyr)
library(lubridate)
##store initial query as a data frame
goldInstrumentDF <- data.frame(InputDataSet)
##set load_ts as a timestamp
formattedDF <- transform(goldInstrumentDF, load_ts = ymd_hms(as.character(goldInstrumentDF$load_ts)))
##set all other column values as characters
i <- sapply(formattedDF, is.factor)
formattedDF[i] <- lapply(formattedDF[i], as.character)
##unpack json object
firstTransform <- formattedDF %>%
mutate(event = map(event, ~ fromJSON(.) %>% as.data.frame())) %>%
unnest(event)
##store load events in a data frame
loadEvents <- firstTransform[firstTransform$object.method == "IMM_Equipment_RePro_Load_Event", ]
##store equipment events in a data frame
equipmentEvents <- firstTransform[firstTransform$object.method != "IMM_Equipment_RePro_Load_Event", ]
##parse the initial characters from the non-standard data exchange format
equipmentSubstring <- equipmentEvents %>% mutate(object.object = substring(equipmentEvents$object.object, 19))
##remove the curly bracked from the end of the non-standard data exchange format
equipmentSubstring2 <- equipmentSubstring %>% mutate(object.object = gsub(''.$'', '''', equipmentSubstring$object.object))
##remove the single quotes from the non-standard data exchange format
equipmentSubstring3 <- equipmentSubstring2 %>% mutate(object.object = gsub("''", "", equipmentSubstring2$object.object))
##split the data from the non-standard data exchange format into a header and a value
namev<-function(x) {
a<-strsplit(x,"=")
setNames(sapply(a,''['',2), sapply(a,''['',1))
}
##turn each row into a named vector
secondTransform <- lapply(strsplit(equipmentSubstring3$object.object, ","), namev)
##find list of all column names
thirdTransform <- unique(unlist(sapply(secondTransform, names)))
##extract data from all rows for every column
fourthTransform <-do.call(rbind, lapply(secondTransform, ''['', thirdTransform))
##rejoin with original data
fifthTransform <-cbind(equipmentSubstring3[,-25], fourthTransform)
##remove exraneous columns
drops <- c(" error", "object.object", NA)
sixthTransform <- fifthTransform[ , !(names(fifthTransform) %in% drops)]
##output the data frame
OutputDataSet <- as.data.frame(sixthTransform)',
@input_data_1 = N'SELECT * FROM openquery(KMhivehttp, ''select * from dmfwk_gold.instrumentapps_event;'');
有没有办法对我来说,动态地定义与基于我数据帧中的数据结果集条款?
不,你不能这样做,因为WITH RESULTS SET
是存储过程执行的一部分。我猜你会想这样做,因为你的sixthTransform
,在卸下错误的列?
如果是这样的话(去除列),也许会更好,如果你返回的错误列,但让他们分配一个“神奇”的价值?这样,你总能得到一个确定的结果集回来。