如何解析大字符串 U-SQL 正则表达式

How to parse big string U-SQL Regex

我有一个包含大字符串的大 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();

这个 wariant 工作正常。但是有一个问题。正则表达式每行 evauated 3 次吗?是否存在提示 U-SQL 引擎的机会 - 函数 Regex.Match 是确定性的。

看起来最好使用类似这样的方法来解析简单的字符串。正则表达式对于任务来说很慢,如果我将使用简单的字符串表达式(而不是 CLR 调用),它们可能会在代码生成阶段被翻译成 C++ 代码……并且 .net 互操作将被消除(我不确定)。

@t1 = 
SELECT
    pv.cust_gads != null ? new SQL.ARRAY<string>(pv.cust_gads.Split(':')) : null AS p
FROM
    dwh.raw_page_view_data AS pv
WHERE
    pv.year == "2017" AND
    pv.month == "04";

@t3 = 
SELECT
    p != null && p.Count == 3 ? p[0].Split('=')[1] : null AS id,
    p != null && p.Count == 3 ? p[1].Split('=')[1] : null AS t,
    p != null && p.Count == 3 ? p[2].Split('=')[1] : null AS s
FROM
    @t1 AS t1;

OUTPUT @t3
TO "/tmp/test.csv"
USING Outputters.Csv();

您可能应该使用比 Regex.Match 更有效的方法。但要回答你原来的问题:

System.Text.RegularExpressions.Match 不属于 built-in U-SQL types

因此您需要将其转换为内置类型,例如 stringSqlArray<string> 或将其包装到提供 IFormatterudt使其成为用户定义的类型。