我们尝试在 ADLA 中使用 U-SQL 从表中发布数据。我们使用以下代码来获取 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;
}
我们无法找出错误行。当我们查看配置文件.xml时,我们没有得到行转储。
用户表达式的内部异常:当前行 转储:">
如何找出导致此异常的错误行?如何解决这类问题?
为了测试,我使用了 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