【问题标题】:USQL using ARRAY_AGG on user defined typeUSQL 在用户定义类型上使用 ARRAY_AGG
【发布时间】:2018-04-28 06:14:09
【问题描述】:

UDT

[SqlUserDefinedType(typeof(StudentHistoryFormatter))]
    public struct StudentHistory
    {
        public StudentHistory(int i, double? score, string status):this()
        {
            InstitutionId = i;
            Score = score;
            Status = status;
        }

        int InstitutionId { get; set; }

        double? Score {get; set; }

        string Status { get; set; }

        public string Value()
        {
            return string.Format("{0},{1},{2}", InstitutionId, Score, Status);
        }
    }

为简单起见,我什至没有将类放在命名空间中。 我用 USQL 数据库注册了程序集

USQL

@history =
    EXTRACT InstitutionId int,
            Score double,
            Status string
    FROM @"CoreData\Institution\history.csv"
    USING Extractors.Csv();

@historyMap =
   SELECT InstitutionId,
               ARRAY_AGG<StudentHistory>(new StudentHistory(InstitutionId, Score, Status)) AS History
        FROM @history
        GROUP BY InstitutionId;

错误

严重性代码描述项目文件行抑制状态 错误 E_CSC_USER_INVALIDCOLUMNTYPE:“Microsoft.Analytics.Types.Sql.SqlArray”不能用作列类型。 描述: 列类型必须是受​​支持的标量、复数或用户定义的类型。 解析度: 确保列类型是受支持的类型。对于用户定义的类型,请确保该类型已注册,类型名称是完全限定的,并且脚本引用了所需的程序集。

【问题讨论】:

  • 不知道为什么我对这个问题投了反对票!
  • 路过式投票是对 SO 的职业危害。我赞成它来平衡它:)

标签: u-sql


【解决方案1】:

错误信息有点不清楚。目前,SqlArray 中唯一支持的项类型是内置的标量和复杂(SqlArray、SqlMap)类型。当前不支持用户定义的类型。

您可以通过创建自己的 ArrayofUDT 用户定义类型或将 UDT 序列化为 byte[] 来对其进行建模。

下面是一个使用 ARRAY_AGG 的后者示例,假设您有一个 ToBinary() 方法允许您将 UDT 转换为 byte[]:

@data = SELECT key, ARRAY_AGG( myUDT.ToBinary() ) AS obj_array FROM @input GROUP BY key;

(有关对象序列化选项的信息,请参阅How to convert an object to a byte array in C#

然后,当您想要取回对象时,您将在对象数组上使用 CROSS APPLY EXPLODE 并使用 byte[] 重新水化 UDT 实例。伪代码:

@objects = 
  SELECT myUDT.FromBinary(data) 
  FROM @data CROSS APPLY EXPLODE (obj_array) AS t(data);

请在 http://aka.ms/adlfeedback 提交功能请求,以获取复杂类型的 UDT。我将针对错误消息提交一个错误。

【讨论】:

  • 感谢您的建议.. 但是我仍然不清楚将 ArrayOfUDT 与 ARRAY_AGG 一起使用的部分.. 有没有资源可以告诉我如何使用它?跨度>
  • 创建您自己的数组 UDT 不起作用 ARRAY_AGG。因此,您应该在使用 ARRAY_AGG 之前将您的 UDT 序列化为 byte[]。我在答案中添加了一个示例。
猜你喜欢
  • 1970-01-01
  • 2015-03-01
  • 2019-10-09
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2021-08-25
相关资源
最近更新 更多