1

我正在用 U-SQL 编写一个自定义减速器,它需要一个查找文件作为减速器构造函数的参数。问题是当我进行本地运行时,它找不到 /data/ 目录下项目中包含的查找文件。这是代码片段:

DECLARE @EventType string = @"/data/EventType.csv"; 
...
@red =
REDUCE @filtered
ON id
PRODUCE 
...
USING new USQLApplication1.MyReducer(@EventType);

这是我收到的错误消息。无论采用何种解决方案,我都希望它不仅可以在本地运行,还可以在天蓝色的云中运行。谢谢。

运行第 1 步(共 1 步)

未处理的异常: System.Exception: {"diagnosticCode":195887132,"severity":"E rror","component":"RUNTIME","source":"User","errorId":"E_RUNTIME_USER_UNHANDLED_EXCEPTION_FROM_USER_CODE","message ":"在用户类型 'USQLApplication1.MyReducer' 上调用方法 'Constructor' 时报告了来自用户代码的未处理异常","description":"来自用户代码的未处理异常: \"找不到文件' D:\Users\jbfp\Documents\Visual Studio 2015\Projects\USQL Application1\USQLApplication1\bin\Debug\ECB1C361139EE2D8\Script2_2E96CB20AE 368E7B\EventType.csv'.\"

4

2 回答 2

2

我无法发表评论,所以我将以这种方式发布我的问题。

您是否使用 DEPLOY RESOURCE 将查找文件部署到工作目录?该文件将需要部署在您的操作正在进行的每个顶点中。因此,需要显式部署。本地部署可能有一些怪癖,但让我们先澄清一下。

于 2016-01-15T01:50:26.073 回答
1

扩展chi的答案。

U-SQL 在两个存储“层”上运行(因为没有更好的术语):

  1. 全局持久存储层。主要是 Azure Data Lake Storage 或 Windows Azure Blob Store。
  2. 每个运行用户定义函数或运算符的节点还提供对节点本地文件系统工作目录的访问。

自定义代码无法通过文件 IO 直接访问全局持久存储层。相反,U-SQL 提供了所谓的 UDO 模型,该模型将通过定义明确的接口向每个节点提供文件的一部分。

那么,如果您想直接读取文件内容,如何访问存储在用户代码中的数据湖中的文件和资源呢?您需要将文件复制(部署)到每个节点的本地工作目录中。这可以通过使用ADDITIONAL_FILEon 选项CREATE ASSEMBLY或使用DEPLOY RESOURCEchi 提到的语句来完成。

话虽如此,本地执行模式似乎在这方面有一个错误,我们已经修复但尚未发布(它可能会在月底发布)。如果您需要更早的修复程序,请告诉我们,我们将看看是否可以部署修复程序。

于 2016-01-15T08:50:09.650 回答