2016-04-01 4 views
0

Ich versuche, eine benutzerdefinierte parallele Extraktor erstellen, aber ich habe keine Ahnung, wie es richtig geht. Ich habe eine große Dateien (mehr als 250 MB), wo Daten für jede Zeile in 4 Zeilen gespeichert werden. Eine Dateizeile speichert Daten für eine Spalte. Ist es möglich, parallel arbeitende Extraktoren für große Dateien zu erstellen? Ich fürchte, dass die Daten für eine Zeile nach der Dateiaufteilung unterschiedlich groß sind.Benutzerdefinierte parallele Extraktor - U-SQL

Beispiel:

... 
Data for first row 
Data for first row 
Data for first row 
Data for first row 
Data for second row 
Data for second row 
Data for second row 
Data for second row 
... 

Sorry für mein Englisch.

Antwort

0

Ich habe entdeckt, dass ich statische Methode kann nicht in USING-Anweisung eine Instanz von IExtractor Implementierung zu bekommen, wenn ich AtomicFileProcessing Satz auf wahren verwenden möchten.

0

Ich denke, Sie können diese Daten mit U-SQL sequentiell nicht parallel verarbeiten. Sie müssen einen benutzerdefinierten Applikator schreiben, um eine einzelne/mehrere Zeilen aufzunehmen und einzelne/mehrere Zeilen zurückzugeben. Und dann können Sie es mit CROSS APPLY aufrufen. Sie können Hilfe von this Applikator nehmen.

+0

Sorry, ich kann mir das nicht vorstellen. Wie werden diese Daten sequentiell verarbeitet? Wenn ich Daten Zeile für Zeile aus der Datei parallel lese (Extraktoren liest immer Daten parallel, auch wenn AtomicFileProcessing auf true gesetzt ist, weiß ich nicht warum), werden sie in falscher Reihenfolge sein, weil Daten für eine Zeile in verschiedenen Dateibereichen sein können. Was sollte dieser Applikator tun? – mieszko91

0

U-SQL-Extraktoren werden standardmäßig so skaliert, dass sie parallel zu kleineren Teilen der Eingabedateien, den so genannten Extents, arbeiten. Diese Extents sind jeweils etwa 250 MB groß.

Heute müssen Sie Ihre Dateien als Dateien mit Zeilenstruktur hochladen, um sicherzustellen, dass die Zeilen an den Extent-Grenzen ausgerichtet sind (obwohl wir in naher Zukunft Unterstützung für Zeilen bereitstellen, die Extent-Grenzen überspannen). In beiden Fällen würde das Extraktor-UDO-Modell jedoch nicht wissen, ob sich Ihre 4 Zeilen alle in der gleichen Ausdehnung oder über sie befinden.

So haben Sie zwei Möglichkeiten:

  1. Mark den Extraktor wie die folgende Zeile vor der Extraktor-Klasse auf der gesamten Datei Betrieb:

    [SqlUserDefinedExtractor(AtomicFileProcessing = true)] 
    

    nun der Extraktor die vollen sehen Datei. Aber Sie verlieren die Skalierung der Dateiverarbeitung.

  2. Sie extrahieren eine Zeile pro Zeile und verwenden eine U-SQL-Anweisung (z. B. mit Window Functions oder einem benutzerdefinierten REDUCER), um die Zeilen zu einer einzelnen Zeile zusammenzuführen.

+0

In meinem Kommentar zur vorherigen Nachricht habe ich geschrieben, warum diese Lösungen in meinem Fall nicht funktionieren. "... Wenn ich Daten Zeile für Zeile aus Datei parallel lesen (Extraktoren liest immer Daten parallel, auch mit AtomicFileProcessing auf True eingestellt, ich weiß nicht warum), werden sie in falscher Reihenfolge sein, da Daten für eine Zeile können in verschiedenen Dateibereichen sein .. " – mieszko91