2017-03-21 5 views
3

Erstplakat, Langzeitleser.Kopieren von Dateiinhalten von Azure Storage nach Azure SQL Db mit Azure Data Factory

Ein Drittanbieter lädt einmal täglich CSV-Dateien in einen gemeinsam genutzten Azure Blob Storage. Die Dateien haben ein bestimmtes Präfix mit einem Zeitstempel im Dateinamen und befinden sich im selben Verzeichnis. F.i. "dw_palkkatekijat_20170320T021" Jede Datei enthält alle vorherigen Daten und die neu hinzugefügten Daten vom vorherigen Tag. Ich möchte alle Zeilen aus allen Dateien in eine SQL-Tabelle in einer Azure SQL DB importieren. Das kann ich tun.

Das Problem, das ich habe, ist, dass ich nicht weiß, wie man den Dateinamen in eine separate Spalte in der Tabelle fügt, damit ich trennen kann, aus welcher Datei die Zeilen kamen, und nur die neuesten Zeilen verwenden. Ich muss alle Inhalte der Dateien importieren und alle "Versionen" der Dateien speichern. Gibt es eine Möglichkeit, den Dateinamen als Parameter für eine gespeicherte SQL-Prozedur zu senden? Oder irgendeine andere Möglichkeit, um dieses Problem zu behandeln?

Vielen Dank für Ihre Hilfe.

Antwort

2

In der aktuellen Situation haben Sie beschrieben, dass Sie nicht den genauen Dateinamen erhalten können. ADF ist kein Datentransformationsdienst, daher gibt es keine Level-Funktionalität ... Ich wünschte, es wäre so!

Es gibt jedoch ein paar Optionen, um den Dateinamen oder etwas ähnliches zu verwenden. Keine von denen, die ich akzeptiere, sind perfekt!

Option 1 (beste Option, ich denke!)

Wie Sie gefragt. Übergeben Sie einen Parameter an die gespeicherte SQL DB-Prozedur. Dies ist mit dem Attribut ADF-Aktivitätsparameter sicher möglich.

Was als param passieren? ...

Nun, haben, wenn Ihre Quelldateien in Blob Speichern ein schön definierten Datum und Uhrzeit im Dateinamen. Welches ist, was Sie bereits in der Eingabe-Dataset-Definition verwenden, dann übergeben Sie das an die Prozedur. Speichern Sie es in der SQL-DB-Tabelle. Dann können Sie herausfinden, wann die Datei geladen wurde und wann und für welchen Zeitraum sich die Überlappung ergibt. Könnte sein?

Sie können auf den Zeitscheibenstart für das Dataset in der Aktivität zugreifen. Beispiel JSON ...

"activities": [ 
     { 
      "name": "StoredProcedureActivityTemplate", 
      "type": "SqlServerStoredProcedure", 
      "inputs": [ 
       { 
        "name": "BlobFile" 
       } 
      ], 
      "outputs": [ 
       { 
        "name": "RelationalTable" 
       } 
      ], 
      "typeProperties": { 
       "storedProcedureName": "[dbo].[usp_LoadMyBlobs]", 
       "storedProcedureParameters": { 
        //like this: 
        "ExactParamName": "$$Text.Format('{0:yyyyMMdd}', Time.AddMinutes(SliceStart, 0))" //tweak the date format 
       } 
      }, //etc .... 

Option 2 (Lasten Aufwand)

selbst erstellen mittleren benutzerdefinierte Aktivität ADF Mannes, der die Datei liest, und die Dateinamen und fügt den Wert als eine Spalte.

Benutzerdefinierte Aktivitäten in ADF geben Ihnen grundsätzlich die Möglichkeit, alles zu tun, da Sie das Datenumwandlungsverhalten in C# erstellen müssen.

Ich würde empfehlen zu lernen, was mit der Verwendung von benutzerdefinierten Aktivitäten beteiligt ist, wenn Sie diesen Weg gehen wollen. Viel mehr Aufwand und ein Azure Batch Service wird benötigt.

Option 3 (Total Overkill)

Verwenden Sie ein Azure Daten See Analytics Service! Gehen Sie genauso vor wie bei Option 2. Verwenden Sie USQL im Datensee, um die Datei zu analysieren und den Dateinamen in das Ausgabe-Dataset aufzunehmen. In USQL können Sie einen Platzhalter für den Dateinamen als Teil des Extraktors übergeben und im Ausgabe-Dataset verwenden.

Ich Marke diese Option als Overkill, weil Verschrauben auf einem kompletten Datenseeservice, nur um einen Dateinamen zu lesen ist übermäßig. In Wirklichkeit könnte data lake wahrscheinlich Ihre SQL DB-Schicht ersetzen und Ihnen die Dateinamen-Transformation kostenlos zur Verfügung stellen.

Übrigens müssen Sie Azure Data Lake-Speicher nicht zum Speichern Ihrer Quelldateien verwenden. Sie könnten dem Analyseservice Zugriff auf das vorhandene freigegebene Blobspeicherkonto gewähren. Sie benötigen es jedoch nur, um den Analysedienst zu unterstützen.

Option 4

Haben umdenken und Azure Daten See statt Azure SQL DB verwenden ?????

Hoffe, das hilft

+0

Hallo @Paul, danke für die Antwort. Option # 1 ist definitiv das, wonach ich bin. Gibt es eine Möglichkeit, Datenscheiben mit "partitioned by" aus einem virtuellen Verzeichnis in einem bestimmten Container zu definieren? Ab sofort werden die Slices täglich mit einem Ordnerpfad ohne Dateinamen erstellt. Alle Slices enthalten also alle Dateien, die zu der Zeit dort waren. Ich könnte natürlich durch die Reihen graben und finde immer die Zeilen mit dem letzten Start-Slice, aber das klingt ein bisschen ungeschickt. –

+0

Ja, alles, was Sie in der Klausel partition by definieren, kann entweder im Ordnernamen oder im Dateinamen enthalten sein. Zum Beispiel: \ RawData \ {YYYY} \ {MM} \ {TT} \ SomeFileName {HHMM} .txt –

+0

Wenn meine obige Antwort hilfreich wäre, würde ich mich freuen, wenn Sie sie als akzeptiert markieren. Danke –

Verwandte Themen