1

我想知道是否有任何提示和技巧可以在数据湖分析工作中发现错误。错误消息似乎大部分时间都不是很详细。

尝试从 CSV 文件中提取时,我经常收到这样的错误

顶点失败触发快速作业中止。顶点失败:SV1_Extract[0] with >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 或默认值,而不是整个作业失败?

谢谢

4

2 回答 2

3

这是一个无需使用代码的解决方案(尽管 Codebehind 将使您的代码更具可读性):

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”。复制整行文本并粘贴到记事本(或其他文本编辑器)中以读取实际错误。

那应该给你确切的错误信息。

于 2016-03-28T19:32:30.347 回答
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."
于 2016-03-28T06:10:59.927 回答