2016-03-27 19 views
1

我想知道是否有任何提示和技巧来发现数据湖分析作业中的错误。错误消息似乎大部分时间不是很详细。调试u-sql作业

当试图从CSV文件中提取我经常收到错误这样

Vertex failure triggered quick job abort. Vertex failed: SV1_Extract[0] with >error: Vertex user code error.

Vertex failed with a fail-fast error

似乎试图将列转换为指定的类型时,会出现这些错误。

我发现的技术是将所有列提取到字符串,然后执行SELECT操作,将尝试将列转换为预期类型。按列操作该列可以帮助查找错误的特定列。

@data = 
    EXTRACT ClientID string, 
      SendID string, 
      FromName string,   
    FROM "wasb://..." 
    USING Extractors.Csv(); 

//convert some columns to INT, condition to skip header 
@clean = 
    SELECT Int32.Parse(ClientID) AS ClientID, 
      Int32.Parse(SendID) AS SendID, 
      FromName,   
    FROM @data 
    WHERE !ClientID.StartsWith("ClientID"); 

是否也可以使用像一个的TryParse在分析错误的情况下返回null或默认值,而不是整个工作失败?

感谢

回答

1

是的,你可以采用U-SQL用户定义函数使用的TryParse。你可以做到这一点,如:

在后面的代码:

namespace TestNS 
{ 
    public class TestClass 
    { 
     public static int TryConvertToInt(string s) 
     { 
      int i = 0; 
      if (Int32.TryParse(s, out i)) 
       return i; 
      return 0; 
     } 
    } 
} 

以U-SQL脚本:

TestNS.TestClass.TryConvertToInt(ClientID) AS clientID 

看起来你有一些其他的问题,因为我总是在适当的错误转换问题的情况,如:

"E_RUNTIME_USER_EXTRACT_COLUMN_CONVERSION_INVALID_ERROR","message":"Invalid character when attempting to convert column data." 
2

这里是一个解决方案,无需使用后面的代码(尽管代码隐藏会让你的代码有点更具可读性):

SELECT ((Func<string, Int32?>)(v => { Int32 res; return Int32.TryParse(v, out res)? (Int32?) res : (Int32?) null; }))(ClientID) AS ClientID 

此外,您看到有关的错误消息是神秘的问题与应在返回所谓的内部错误消息很快被修正了一个错误的事情。目前的工作是执行以下操作:

  1. 在用于VisualStudio的ADL工具中,打开失败作业的作业视图。
  2. 在左下角,单击作业详细信息区域中的“资源”链接。
  3. 加载作业资源后,点击“配置文件”。
  4. 在行首搜索字符串“jobError”。复制整行文本并粘贴到记事本(或其他文本编辑器)中以读取实际的错误。

这应该会给你准确的错误信息。

+0

感谢您提供有关详细错误的提示。我怀疑问题是在文件中有特殊字符。这证实了它。我的文件是AINSI编码的,而不是UTF-8。除了转换文件之外,有没有办法解决这个问题? – Olivier

+0

现在唯一的解决方法是编写自己的自定义提取器或将字段提取为byte [],然后自己执行代码页转换。如果您知道所需的ANSI编码,请在此处投票:https://feedback.azure.com/forums/327234-data-lake/suggestions/13077555-add-ansi-code-page-support-for-built-in -extractors –