U-SQL子串超出范围异常

时间:2018-04-20 12:52:30

标签: substring azure-data-lake u-sql outofrangeexception

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

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

但是,我们收到了以下错误:

  

E_RUNTIME_USER_EXPRESSION_EVALUATION&gt;   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时,我们没有得到行转储。

  

用户表达式的内部异常:\ n当前行   转储:“

如何查找导致此异常的错误行?如何排除这些问题?

2 个答案:

答案 0 :(得分:2)

为了测试我使用了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();

答案 1 :(得分:2)

我们提出了产品组的问题。看来U-SQL中的子串操作存在一些问题。他们要求我们将以下修复应用于子串计算。我们尝试了它并且它正常工作。

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