我有一个包含大字符串的大 CSV。我想用 U-SQL 解析它们。
@t1 =
SELECT
Regex.Match("ID=881cf2f5f474579a:T=1489536183:S=ALNI_MZsMMpA4voGE4kQMYxooceW2AOr0Q", "ID=(?<ID>\\w+):T=(?<T>\\w+):S=(?<S>[\\w\\d_]*)") AS p
FROM
(VALUES(1)) AS fe(n);
@t2 =
SELECT
p.Groups["ID"].Value AS gads_id,
p.Groups["T"].Value AS gads_t,
p.Groups["S"].Value AS gads_s
FROM
@t1;
OUTPUT @t
TO "/inhabit/test.csv"
USING Outputters.Csv();
Severity Code Description Project File Line Suppression State Error E_CSC_USER_INVALIDCOLUMNTYPE: 'System.Text.RegularExpressions.Match' cannot be used as column type.
我知道如何使用 EXPLODE/CROSS APPLY/GROUP BY 以 SQL 方式执行此操作。但也许没有这些舞蹈是可能的吗?
还有更新
@t1 =
SELECT
Regex.Match("ID=881cf2f5f474579a:T=1489536183:S=ALNI_MZsMMpA4voGE4kQMYxooceW2AOr0Q", "ID=(?<ID>\\w+):T=(?<T>\\w+):S=(?<S>[\\w\\d_]*)").Groups["ID"].Value AS id,
Regex.Match("ID=881cf2f5f474579a:T=1489536183:S=ALNI_MZsMMpA4voGE4kQMYxooceW2AOr0Q", "ID=(?<ID>\\w+):T=(?<T>\\w+):S=(?<S>[\\w\\d_]*)").Groups["T"].Value AS t,
Regex.Match("ID=881cf2f5f474579a:T=1489536183:S=ALNI_MZsMMpA4voGE4kQMYxooceW2AOr0Q", "ID=(?<ID>\\w+):T=(?<T>\\w+):S=(?<S>[\\w\\d_]*)").Groups["S"].Value AS s
FROM
(VALUES(1)) AS fe(n);
OUTPUT @t1
TO "/inhabit/test.csv"
USING Outputters.Csv();
这个警告工作得很好。但有一个问题。正则表达式每行会计算 3 次吗?是否存在提示 U-SQL 引擎的机会 - 函数 Regex.Match 是确定性的。
最佳答案
您可能应该使用比 Regex.Match 更有效的东西。但要回答你原来的问题:
System.Text.RegularExpressions.Match
不属于 built-in U-SQL types .
因此您需要将其转换为内置类型,例如string
或SqlArray<string>
或将其包装成 udt提供 IFormatter
使其成为用户定义的类型。
关于azure-data-lake - 如何解析大字符串 U-SQL 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43278757/