【问题标题】:Multithreaded function for Pivoting Data in R in SQL Server 2016SQL Server 2016 中用于在 R 中透视数据的多线程函数
【发布时间】:2019-01-04 12:49:54
【问题描述】:

目前我正在使用reshape 库来透视 R 中的数据,但是当我有很多列(4000+)时它似乎很困难。是否有任何多线程替代此功能(类似于 MS 的 RevoScaleR 包)或任何更好的方法来做到这一点?

这是我现在拥有的代码示例:

DROP TABLE IF EXISTS #DummyData
CREATE TABLE #DummyData
(
     [VariableA] VARCHAR(24)
    ,[VariableB] VARCHAR(24)
    ,[Value] SMALLINT
)

INSERT INTO #DummyData([VariableA], [VariableB], [Value])
VALUES   ('A1','B1', 4)
        ,('A1','B2', 3)
        ,('A1','B3', 1)
        ,('A2','B1', 2)
        ,('A2','B2', 1)
        ,('A2','B3', 3)
        ,('A3','B1', 4)
        ,('A3','B2', 5)
        ,('A3','B3', 2);

EXECUTE sp_execute_external_script    
      @language = N'R'   
    , @script = N'
        library(reshape)
        pivotData <- cast(DataIn, VariableA ~ VariableB  ,fun.aggregate = max)
        DataOut <- pivotData
    '   
    , @input_data_1 = N'SELECT [VariableA], [VariableB], [Value] FROM #DummyData'
    , @input_data_1_name  = N'DataIn'   
    , @output_data_1_name =  N'DataOut';

此查询返回以下结果:

【问题讨论】:

  • SQL Server 使用 Revo R。此外,你想做什么?你真的有一个有 4000 列的表吗?还是您想将 4000 行转换为 3 行?
  • SQL Server 是多线程的,速度很快。您可以使用 SQL Server 聚合数据,按 VarA、VarB 分组并将结果转置为 4K 列宽的数据框。
  • @PanagiotisKanavos 我怀疑使用 T-SQL 创建具有 4000 多列的 PIVOT 会比一些 R 函数更快。
  • 我在 R 中进行数据透视的原因是我将使用 R 中的这些数据进行额外的计算,并且我需要这种格式的数据。在将数据传递给 R 脚本之前,我尝试过对数据进行透视,但这样会慢很多。

标签: r sql-server tsql sql-server-2016 microsoft-r


【解决方案1】:

sql server 中的 Pivot 在内部映射到 group by。多年来,sql server 的优化器中添加了许多优化,包括基础查询并行性。请试一试。外部脚本的启动成本非常高,因此在这种情况下,您可能会发现保持原生是一个更好的计划。

【讨论】:

  • 我在 R 中进行数据透视的原因是我将使用 R 中的这些数据进行额外的计算,并且我需要这种格式的数据。在将数据传递给 R 脚本之前,我尝试过对数据进行透视,但这样会慢很多。
  • 如果你最终有很多列,那么到 R 的传输可能会成为一个更大的问题,因为它是一种面向列的压缩传输格式。如果您在 SQL 端进行透视,数据量可能相同,但列数可能会更大/压缩可能不会那么好。所以,我可以看到这可能会成为一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多