Process unstructured data with UDF and procedure handlers¶
Unter diesem Thema werden Beispiele für das Lesen und Verarbeiten unstrukturierter Daten in Stagingdateien mit Handler-Code bereitgestellt, der für Folgendes geschrieben wurde:
Sie können auch eine Datei mit Handlern lesen, die in anderen Sprachen geschrieben sind:
- Python:
- Scala:
Bemerkung
Um Ihren Code widerstandsfähig gegen Angriffe per Dateieinschleusung zu machen, verwenden Sie immer eine Bereichs-URL, wenn Sie den Speicherort einer Datei an eine UDF übergeben, insbesondere wenn der Aufrufer der Funktion nicht auch ihr Eigentümer ist. Mit der integrierten Funktion BUILD_SCOPED_FILE_URL können Sie eine Bereichs-URL in SQL erstellen. Weitere Informationen zur Funktion BUILD_SCOPED_FILE_URL finden Sie unter Einführung in unstrukturierte Daten.
PDF mit UDF und Prozedur verarbeiten¶
Die Beispiele in diesem Abschnitt verarbeiten Stagingdateien mit unstrukturierten Daten mithilfe von Java-Handler-Code – zunächst mit einer UDF, dann mit einer Prozedur. Beide Handler extrahieren den Inhalt einer angegebenen PDF-Datei unter Verwendung der Apache PDFBox-Bibliothek.
Der Handler-Code von UDF und Prozedur ist sehr ähnlich. Er unterscheidet sich darin, wie die übergebene PDF-Datei gelesen wird.
Bei der UDF liest der Handler die Datei mithilfe eines Java-
InputStream.Bei der Prozedur liest der Handler die Datei mithilfe eines Snowflake-
SnowflakeFile.
Die Beispiele verwenden den Handler-Code inline (im Gegensatz zu kompiliertem Code in einer JAR-Datei in einem Stagingbereich), was bedeutet, dass Sie den Handler-Code nicht kompilieren, packen und in einen Stagingbereich hochladen müssen. Weitere Informationen zum Unterschied zwischen Inline-Handler und Staging-Handler finden Sie unter Speichern von Handler-Code inline oder in einem Stagingbereich.
PDFBox-Bibliothek herunterladen¶
Bevor Sie mit dem Schreiben der UDF beginnen, laden Sie die JAR-Datei mit der PDFBox-Bibliothek herunter, falls Sie sie noch nicht haben. Diese wird eine Abhängigkeit für Ihren Handler-Code sein. Sie werden die JAR-Bibliotheksdatei später in einen Stagingbereich hochladen.
Laden Sie die neueste Version der Bibliothek von der Download-Seite für die Apache-PDFBox-Bibliothek herunter.
Stagingbereiche erstellen¶
Erstellen Sie Stagingbereiche, in denen Sie die Bibliotheken für die Abhängigkeiten Ihres Handler-Codes und die Datendatei, die der Handler-Code lesen wird, aufbewahren.
Mit dem nachstehenden Code erstellen Sie separate interne Stagingbereiche, um Folgendes aufzubewahren:
Eine JAR-Bibliotheksdatei, die eine Abhängigkeit für Ihren Handler darstellt. Sie referenzieren den Stagingbereich und die JAR-Datei über die UDF.
Eine Datendatei, die von Ihrem Handler-Code gelesen wird.
Der Code im folgenden Beispiel verwendet den Befehl CREATE STAGE, um die Stagingbereiche zu erstellen, die Sie benötigen.
Benötigte Bibliothek und zu lesende PDF-Datei hochladen¶
Führen Sie die folgenden Schritte aus, um die JAR-Abhängigkeitsdatei (mit dem Bibliothekscode, der die PDF verarbeitet) und die Datendatei (die PDF-Datei, die der Handler-Code verarbeiten wird) hochzuladen.
Sie können in diesem Beispiel eine PDF-Datei Ihrer Wahl verwenden.
Kopieren Sie die JAR-Datei für Apache PDFBox aus dem lokalen temporären Verzeichnis in den Stagingbereich, in dem JAR-Dateien gespeichert werden:
- Linux/Mac:
- Windows:
Kopieren Sie die PDF-Datei aus dem lokalen temporären Verzeichnis in den Stagingbereich, in dem Datendateien gespeichert werden:
- Linux/Mac:
- Windows:
UDF erstellen und aufrufen¶
Führen Sie die folgenden Schritte aus, um eine UDF zu erstellen, die PDF-Dateien liest und verarbeitet.
Fügen Sie den folgenden Code zum Erstellen einer UDF ein, und führen Sie ihn aus.
Der Handler dieser UDF parst PDF-Dokumente und ruft deren Inhalt ab. Der Handler verwendet die Klasse
InputStream, um die Datei zu lesen. Weitere Informationen zum Lesen von Dateien mitInputStreamfinden Sie unter Lesen einer mit InputStream dynamisch spezifizierten Datei.Aktualisieren Sie die Verzeichnistabelle des Stagingbereichs
data_stagemit dem Befehl ALTER STAGE:Rufen Sie die UDF auf, um die PDF-Datei im Stagingbereich zu lesen und den Inhalt zu extrahieren.
Der Code im folgenden Beispiel ruft die UDF auf und übergibt eine Bereichs-URL, um den Code widerstandsfähig gegen Angriffe per Dateieinschleusung zu machen. Verwenden Sie immer eine Bereichs-URL, wenn der Aufrufer der Funktion nicht auch dessen Eigentümer ist. Sie können das URL-Argument als Bereichs-URL oder in einem anderen Format übergeben, wenn der Aufrufer der UDF auch dessen Eigentümer ist.
Prozedur erstellen und aufrufen¶
Führen Sie die folgenden Schritte aus, um eine Prozedur zu erstellen, die PDF-Dateien liest und verarbeitet.
Fügen Sie den folgenden Code zum Erstellen einer Prozedur ein, und führen Sie ihn aus.
Der Handler dieser Prozedur parst PDF-Dokumente und ruft deren Inhalt ab. Der Handler verwendet die Klasse
SnowflakeFile, um die Datei zu lesen. Weitere Informationen zum Lesen von Dateien mitSnowflakeFilefinden Sie unter Lesen einer mit SnowflakeFile dynamisch spezifizierten Datei.Aktualisieren Sie die Verzeichnistabelle des Stagingbereichs
data_stagemit dem Befehl ALTER STAGE:Rufen Sie die Prozedur auf, um die PDF-Datei im Stagingbereich zu lesen und den Inhalt zu extrahieren.
Der Code im folgenden Beispiel übergibt eine Bereichs-URL, die auf die PDF-Datei in dem Stagingbereich verweist, den Sie erstellt haben.
CSV-Datei mit einer UDTF verarbeiten¶
Das Beispiel in diesem Abschnitt verarbeitet Stagingdateien mit Java UDTFs, die Text aus den Dateien extrahieren und zurückgeben.
Daten-Stagingbereich erstellen¶
Erstellen Sie einen Stagingbereich mit dem Befehl CREATE STAGE:
Mit der folgenden SQL-Anweisung wird ein interner Stagingbereich zur Speicherung der Datendateien für das Beispiel erstellt:
Zu lesende CSV-Datei hochladen¶
Kopieren Sie die CSV-Datei aus dem lokalen temporären Verzeichnis in den Stagingbereich, in dem Datendateien gespeichert werden:
- Linux/Mac:
- Windows:
UDTF erstellen und aufrufen¶
Dieses Beispiel extrahiert den Inhalt einer angegebenen Menge von CSV-Dateien und gibt die Zeilen in einer Tabelle zurück. Durch die Verarbeitung von Dateidaten beim Lesen aus der Quelle können Sie potenzielle Speicherplatzprobleme vermeiden, die bei sehr großen Dateien auftreten können.
Der Code im folgenden UDTF-Handler-Beispiel verwendet SnowflakeFile, um einen InputStream aus einer Datei-URL zu generieren und eine CSV-Datei zu lesen. (In einem Java-UDTF-Handler beginnt die Zeilenverarbeitung, wenn Snowflake die von Ihnen implementierte process-Methode aufruft). Der Code verwendet den Stream, wenn er eine Instanz einer CsvStreamingReader-Klasse konstruiert, die im Handler selbst definiert ist.
Die Klasse CsvStreamingReader liest den Inhalt des empfangenen CSV-Dateistreams zeilenweise und bietet eine Möglichkeit für andere Codes, jede Zeile als Datensatz abzurufen, wobei die Spalten durch Kommas getrennt werden. Mit der process-Methode wird jeder Datensatz zurückgegeben, wenn er aus dem Stream gelesen wird.
Weitere Informationen zum Schreiben von benutzerdefinierten Tabellenfunktionen (UDTFs) mit einem Java-Handler finden Sie unter Tabellarische Java-UDFs (UDTFs).
Führen Sie die folgenden Schritte aus, um die Java-UDTF zu erstellen und die erforderlichen Dateien hochzuladen:
Erstellen Sie eine Java-UDTF, die die Klasse
SnowflakeFileverwendet:Aktualisieren Sie die Verzeichnistabelle für den Stagingbereich
data_stage:Rufen Sie die Java-UDTF auf, um eine oder mehrere CSV-Stagingdateien zu lesen und deren Inhalt in ein Tabellenformat zu extrahieren:
Der Code im folgenden Beispiel ruft die UDF auf und übergibt eine Bereichs-URL, um das Risiko von Angriffen per Dateieinschleusung zu reduzieren. Es wird immer eine Bereichs-URL verwendet, wenn der Aufrufer der Funktion nicht auch dessen Eigentümer ist. Das URL-Argument kann als Bereichs-URL oder in einem anderen unterstützten Format übergeben werden, wenn der Aufrufer der UDF auch dessen Eigentümer ist.