U-SQL 子串越界异常

U-SQL Substring out of range exception

我们正在尝试使用 ADLA 中的 U-SQL 从 table 发布数据。我们使用以下代码获取 FirstName 的子字符串,因为我们希望将 FirstName 的长度限制为 50 个字符。

SELECT (firstName == null || firstName.Length <= 50) ? firstName : firstName.Substring(0, 50) AS FirstName

但是,我们遇到以下错误:

E_RUNTIME_USER_EXPRESSION_EVALUATION > E_RUNTIME_USER_SUBSTRING_OUT_RANGE

当我们尝试使用自定义 .NET 代码执行子字符串时,我们没有遇到异常。作业正在成功完成。我们没有收到任何错误行。

public static string DoSubString(string firstName)
        {
            string subFirstName;

            try
            {
                subFirstName = (firstName == null || firstName.Length <= 50) ? firstName : firstName.Substring(0, 50);

            }
            catch(ArgumentOutOfRangeException ae)
            {
                subFirstName = string.Format("Argument Out of range Error {0} {1}",firstName,ae.Message);
            }
            catch(Exception Ex)
            {
                subFirstName = string.Format("Generic Error {0} {1}",firstName, Ex.Message); 
            }

            return subFirstName;

        }

我们无法找出错误行。当我们查看 Profile.xml 时,我们没有得到行转储。

Inner exception from user expression: \nCurrent row dump: "

如何找出导致此异常的错误行?如何解决此类问题?

为了测试,我使用了 10 个字符,修改为 50 个。

@table = 
SELECT * FROM 
    ( VALUES
    ("appleJackss"),
    ("apple Jacks"),
    ("appleJacks"),
    ("                 "),
    (""),
    ((string)null)
    ) AS T(word);

@result = 
SELECT  //Method 1
        CASE
            WHEN word.Length <= 10 THEN word
            ELSE word.Substring(0, 10)
        END AS justTen,

        // Method 2
        (word.Length <= 10) ? word : word.Substring(0, 10) AS anotherTen
FROM @table;

OUTPUT @result
TO "/Temp/Example1.txt"
USING Outputters.Tsv();

我们提出了产品组的问题。 U-SQL中的子串操作好像有问题。他们要求我们将以下修复程序应用于子字符串计算。我们试过了,它工作正常。

SELECT (firstName == null || firstName.Length <= 50) ? firstName : firstName.Substring(0, Math.Min(firstName.Length, 50)) AS FirstName