Сводка квантилей со скриптом R в SQL Сервер + data.table + rxDataStep - PullRequest
0 голосов
/ 27 января 2020

Я запускаю скрипт на SQL Сервер, который вычисляет квантили и несколько других «пользовательских» метрик в чанках через rxDataStep.

DECLARE @Rscript nvarchar(max) = N'

library("data.table")

connStr <- "Driver={ODBC Driver 13 for SQL Server};Server=TOMAZK\MSSQLSERVER2017;Database=AdventureWorks;Trusted_Connection=Yes"
query <- "SELECT [LOTNAME] --varchar
      ,[WAFERNUMBER] --varchar
      ,[SLOT]--varchar
      ,[RECIPE] --varchar
      ,[MODULENAME] --varchar
      ,[LOT_START] --datetime
      ,[STEP_IN] --datetime
      ,[STEPNAME] --varchar
      ,[MVName] AS MVNAME --varchar
      ,[MaxVal] --FLOAT
      ,[WAFERNAME]--varchar
      ,[SOURCE] FROM dbo.TABLE 


    outTabName <- "STAGE_TABLE"

    quant_func <- function(data){
  setDT(data)

  data[,.(Q1 = quantile(MaxVal, 0.25), Q3 = quantile(MaxVal, 0.75), MEDIANVAL = quantile(MaxVal, 0.50), IQR = quantile(MaxVal, 0.75)-quantile(MaxVal, 0.25),ROBUST_SIGMA = (quantile(MaxVal, 0.75)-quantile(MaxVal, 0.25))/1.35,MAX_STEP_IN = max(STEP_IN)), .(LOTNAME, STEPNAME,  WAFERNUMBER, WAFERNAME,LOT_START,RECIPE,MVNAME,SOURCE,MODULENAME)]};
    inTabDS <- RxSqlServerData(sqlQuery = query, connectionString =connStr)
    outTabDS <- RxSqlServerData(table = outTabName, connectionString = connStr)

rxDataStep(inData = inTabDS, outFile = outTabDS, maxRowsByCols = NULL, rowsPerRead = 500000, transformFunc = quant_func, transformPackages ="data.table", overwrite = TRUE)'





EXEC sp_execute_external_script @language = N'R'
      , @script = @Rscript
WITH result sets none;
GO 

По какой-то причине я продолжаю получать более 1 значения "STEP_IN" после сводки вместо того, чтобы получать значение MAX в каждой группе, как предполагалось. Я полагаю, что это так, потому что способ, которым rxDataStep работает, «разбивая» данные во время обработки. У меня сложилось впечатление, что решение лежит где-то в моем transformFun c (quant_fun c), возможно, отсутствует l для 1014 *, чтобы точно выбрать максимум (STEP_IN), несмотря на порцию, но я не уверен, как реализовать это ... Любая помощь очень ценится.

PS1: я использую rxDataStep, потому что нужно прочитать более 1 миллиарда строк, поэтому в противном случае он не поместится в памяти.

PS2: я использую библиотеку data.table, потому что так far имеет лучшую производительность по сравнению, например, с base r и / или dplyr.

ОБНОВЛЕНИЕ: Мой код работает очень хорошо, когда число строк во входных данных <= rowPersRead (500000) значение, которое я установил в rxDataStep. Таким образом, ясно, что проблема с порцией. Просто нужно знать, как справиться с этим поведением в моем TransformFun c. </p>

...