视图中未引用自定义程序集

Custom assemblies not being referenced in Views

如果在 View 中使用自定义 c# 程序集,编译器无法找到对命名空间的引用。 如果在查询中引用和调用程序集而不是从视图中引用和调用程序集,它会起作用。

例如,考虑这个用于创建视图的 U-SQL 脚本: 正在使用的程序集在 运行 此查询之前在 mylocaldb 中注册,并且可以在任何脚本中访问。

USE DATABASE mylocaldb;

REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];

USING Newtonsoft.Json;
USING Microsoft.Analytics.Samples.Formats.Json;

DROP VIEW IF EXISTS SearchAccountData;
CREATE VIEW MyView AS
EXTRACT
    UserId string,
    UserName string        
FROM "Data/mydata.json"
USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor();

脚本执行后,视图被创建并存储在 mylocaldb 数据库中的 Views 下。

在另一个查询中使用视图时:

USE DATABASE mylocaldb;
USE SCHEMA dbo;

REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];

USING Newtonsoft.Json;
USING Microsoft.Analytics.Samples.Formats.Json;

@foo= SELECT * FROM MyView;

OUTPUT @foo
TO  "/output/foo.csv"
USING Outputters.Csv();

USE SCHEMA dbo 不是必需的,因为如果没有其他模式被使用,数据库默认为该值):

编译器抛出错误:

E_CSC_USER_INVALIDCSHARP: C# error CS0234: The type or namespace name 'Samples' does not exist in the namespace 'Microsoft.Analytics' (are you missing an assembly reference?)

现在这可能与 U-SQL: Microsoft.Analytics 附带的库冲突,但我尝试使用另一个具有不同命名空间的程序集,但我仍然遇到同样的问题。

我正在使用 VisualStudio 中的(本地)帐户进行本地测试。

我决定使用 PROCEDURE。 在 Views 中,无法使用 UDF(用户定义函数)或 UDO。

观看次数不能:

  • 包含 user-defined 个对象(例如 UDF 或 UDO)。
  • 将在调用时内联。

此信息可在幻灯片 27 的 U-SQL - Azure Data Lake Analytics for Developers

处找到

如果在 Views 的 U-SQL 语言参考文档中提到了这一点,那将会很有帮助。

与视图不同,过程和 table-valued 函数支持 UDF,并且可以包括对程序集的引用:.

CREATE PROCEDURE ExtractTransactions(@data_stream string = @"Data/{*}")
AS BEGIN

    REFERENCE ASSEMBLY [Newtonsoft.Json];
    REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];

    USING Newtonsoft.Json;
    USING Microsoft.Analytics.Samples.Formats.Json;

    @transactions =
        EXTRACT
            UserId string,
            UserName string        
        FROM @data_stream 
        USING new JsonExtractor();

    INSERT INTO ExtractedTransactions
    SELECT * FROM @transactions;
END;

然后只需从另一个查询中调用过程:

ExtractTransactions(DEFAULT)(其中 DEFAULT 是默认参数)。

感谢 Mike & spanturious。 U-SQL 官方 U-SQL 语言参考网站

的 Query_Expression 部分下的 CREATE VIEW (U-SQL) 更新了语言参考

(注意:会提供 link,但上帝会在我这样做时不断删除我的回复。只需搜索 "CREATE VIEW (U-SQL)"。)