2017-04-07 14 views
1

大きな文字列を含む大きなCSVがあります。私はU SQLでそれらを解析したい。大きな文字列を解析する方法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関数は確定的です。

答えて

1

おそらくRegex.Matchよりも効率的なものを使用しているはずです。しかし、元の質問に答えて:

System.Text.RegularExpressions.Matchbuilt-in U-SQL typesの一部ではありません。

したがって、あなたは、このようなstringSqlArray<string>として、ビルトインタイプに変換するか、ユーザー定義型にするためにIFormatterを提供udtにそれをラップする必要があります。

+0

を使用しています。いつものように、スプリットのような単純な文字列の操作を使うか、サブストリングだけかもしれません。文字列のような見た目は一定の長さの部分から構成されているからです。一つの簡単な質問。文字列の操作はネイティブコードにコード化されていますか? substring/split/...のようなすべての文字列の操作は.net呼び出しにつながるか、ネイティブコードにコンパイルされた一連の文字列操作が存在するのでしょうか? – churupaha

0

単純な文字列を解析するために、このようなものを使用する方が良いように見えます。 Regexesはタスクが遅く、CLR呼び出しの代わりに単純な文字列式を使用すると、おそらくcodegenフェーズでC++コードに変換され、.net interopは削除されます(わかりません)。

@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(); 
+0

コードゲンの出力に合わせて、CLR – churupaha

関連する問題