【问题标题】:How to parse big string U-SQL Regex如何解析大字符串 U-SQL 正则表达式
【发布时间】:2017-04-07 12:55:24
【问题描述】:

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

严重性代码描述项目文件行抑制状态 错误 E_CSC_USER_INVALIDCOLUMNTYPE: 'System.Text.RegularExpressions.Match' 不能用作列类型。

我知道如何使用 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 工作正常。但是有一个问题。正则表达式会每行计算 3 次吗?是否存在提示 U-SQL 引擎的任何机会 - Regex.Match 函数是确定性的。

【问题讨论】:

    标签: azure-data-lake u-sql


    【解决方案1】:

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

    System.Text.RegularExpressions.Match 不是built-in U-SQL types 的一部分。

    因此,您需要将其转换为内置类型,例如stringSqlArray&lt;string&gt;,或者将其包装成提供IFormatterudt 以使其成为用户定义的类型。

    【讨论】:

    • 一如既往地感谢您,将使用简单的字符串操作,如拆分或可能只是子字符串。因为看起来字符串由具有恒定长度的部分组成。一个简单的问题。哪个字符串的操作被代码生成为本机代码?是否所有字符串的操作(如 substring/split/...)都会导致 .net 调用,或者可能存在一组编译为本机代码的字符串操作?
    【解决方案2】:

    看起来最好使用这样的东西来解析简单的字符串。正则表达式的任务很慢,如果我将使用简单的字符串表达式(而不是 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();
    

    【讨论】:

      猜你喜欢
      • 2016-04-29
      • 1970-01-01
      • 2011-11-22
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多