2017-04-07 44 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.Match不是built-in U-SQL types的一部分。

因此,你需要將其轉換成一個內置的類型,如stringSqlArray<string>或者把它包裝成一個udt,提供了一個IFormatter,使之成爲用戶定義類型。

+0

一如既往地感謝你,使用簡單的字符串的操作,如Split或可能只是Substring。因爲看起來像字符串由長度不變的部分組成。一個簡單的問題。這些字符串的操作是否被編碼爲本地代碼?是所有字符串的操作像substring/split/...導致.net調用,或者是否存在一組字符串的操作編譯爲本機代碼? – churupaha

0

看起來像使用這樣的東西來解析簡單的字符串更好。正則表達式的任務是緩慢的,如果我將使用簡單的字符串表達式(而不是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

相應的codegen輸出,它使用CLR – churupaha