0

我正在 SQL Server 中运行一个脚本,该脚本通过 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 在处理时“分块”数据的方式。我的印象是解决方案位于我的 transformFunc (quant_func) 中的某个地方,尽管有分块,但可能缺少一个 for 循环来准确选择 max(STEP_IN),但我不知道如何实现它......任何帮助都是非常感激。

PS1:我使用 rxDataStep 因为有超过 10 亿行要读取,所以它不适合内存。

PS2:我正在使用 data.table 库,因为到目前为止,与 base r 和/或 dplyr 相比,它的性能最好。

更新:当输入数据中的行数 <= 我在 rxDataStep 中设置的 rowsPerRead(500000) 值时,我的代码工作得很好。所以很明显,问题出在分块上。只需要知道如何在我的 TransformFunc 中处理该行为。

4

0 回答 0