如何解析大字符串 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。
因此您需要将其转换为内置类型,例如 string
或 SqlArray<string>
或将其包装到提供 IFormatter
的 udt使其成为用户定义的类型。
我有一个包含大字符串的大 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。
因此您需要将其转换为内置类型,例如 string
或 SqlArray<string>
或将其包装到提供 IFormatter
的 udt使其成为用户定义的类型。