2017-04-07 6 views
1

Ich habe eine große CSVs, die große Zeichenfolgen enthalten. Ich möchte sie in U-SQL analysieren.Wie zu analysieren große Zeichenfolge U-SQL Regex

@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 Beschreibung Projektdatei Zeilenunterdrückungszustand Fehler E_CSC_USER_INVALIDCOLUMNTYPE: 'System.Text.RegularExpressions.Match' kann nicht als Spaltentyp verwendet werden.

Ich weiß, wie es in SQL mit EXPLODE/Cross APPLY/GROUP BY zu tun. Aber ist es möglich, auf diese Tänze zu verzichten?

Ein weiteres Update

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

Diese wariant funktioniert gut. Aber da ist eine Frage. Wird der Regex 3 Mal pro Reihe ausgezehrt? Gibt es eine Chance, U-SQL-Engine anzudeuten - die Funktion Regex.Match ist deterministisch.

Antwort

1

Sie sollten wahrscheinlich etwas effizienter als Regex.Match verwenden. Aber um Ihre ursprüngliche Frage zu beantworten:

System.Text.RegularExpressions.Match ist nicht Teil der built-in U-SQL types.

So müssen Sie es in einen eingebauten Typen konvertieren, wie string oder SqlArray<string> oder in ein udt wickeln, die ein IFormatter machen es zu einem benutzerdefinierten Typ bietet.

+0

danke wie immer, werde einfache String-Operationen wie Split oder nur Teilstring verwenden. weil die Saiten aus Teilen mit konstanten Längen bestehen. eine einfache Frage. Welche String-Operationen werden mit einem systemeigenen Code verknüpft? Sind alle Operationen von string wie substring/split/... zu .net-Aufrufen führen oder gibt es vielleicht eine Reihe von string-Operationen, die zu einem nativen Code kompiliert werden? – churupaha

0

Sieht so aus, als ob es besser ist, so etwas zu verwenden, um die einfachen Strings zu analysieren. Regexes sind langsam für die Aufgabe und wenn ich einfache Zeichenfolgenausdrücke (anstelle von CLR-Aufrufen) verwende, werden sie wahrscheinlich in C++ - Code in der Codegen-Phase übersetzt ... und .net interop wird eliminiert (ich bin mir nicht sicher).

@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

entsprechend codegen Ausgang, verwenden Sie CLR – churupaha