Database

SAS und Impala: Wie man die Schemaauflösung nach Namen im SQL-Pass-Through erzwingt

Simon 12 Aufrufe

Bei der Abfrage von Impala-Tabellen, die als Parquet-Dateien über SAS© gespeichert sind, kann ein heimtückisches Problem auftreten: Die Daten werden in der falschen Reihenfolge angezeigt oder die Spalten enthalten falsche Werte.

Dieses Phänomen ist oft darauf zurückzuführen, wie Impala die Metadaten von Parquet-Dateien liest. Standardmäßig, wenn die Struktur der physischen Datei geringfügig von der Tabellendefinition abweicht (z. B. eine andere Spaltenreihenfolge), kann Impala versuchen, die Spalten anhand ihrer Position (Index) anstatt ihres Namens zuzuordnen.

Um dies direkt in Impala zu korrigieren, wird die Option PARQUET_FALLBACK_SCHEMA_RESOLUTION=name verwendet. Aber wie wendet man diese spezifische Konfiguration an, wenn man das SQL-Pass-Through in SAS© verwendet?

SAS und Impala: Wie man die Schemaauflösung nach Namen im SQL-Pass-Through erzwingt -

Das Problem: Die Schema-Inkonsistenz

Wenn Sie versuchen, eine Tabelle über SAS© ohne diese Option zu extrahieren, stellen Sie möglicherweise fest, dass die Werte nicht den richtigen Spalten entsprechen. Dies geschieht, weil Impala auf die Reihenfolge der Spalten zurückgreift.

Ein häufiger Versuch besteht darin, diese Option direkt in die Verbindungszeichenfolge zu integrieren (connect to impala (&impala.)) oder den SET-Befehl an der falschen Stelle auszuführen (z. B. beim Erstellen einer temporären Ansicht), was oft keine Wirkung zeigt.

Die Lösung: Sequenzielle Ausführung

Der Schlüssel zur Lösung dieses Problems liegt im Verständnis, dass die Pass-Through-Sitzung die Konfigurationsanweisung vor der Ausführung der Datenauswahlabfrage erhalten muss, jedoch innerhalb desselben Verbindungsblocks.

Man muss die Anweisung EXECUTE BY IMPALA verwenden, um den SET-Befehl an die Datenbank zu senden, kurz bevor man den SELECT startet.

Die schrittweise Vorgehensweise

  1. Verbindung öffnen zu Impala.

  2. Konfigurationsoption ausführen, um die Auflösung nach Namen zu erzwingen.

  3. Daten abrufen über die hergestellte Verbindung.

Beispiel für korrigierten Code

Hier ist die funktionierende SAS© PROC SQL-Syntax für diesen Anwendungsfall:

1PROC SQL;
2 /* 1. Établir la connexion */
3 connect to impala (&impala.);
4 
5 /* 2. Définir l'option de résolution de schéma */
6 execute BY impala (SET PARQUET_FALLBACK_SCHEMA_RESOLUTION=name);
7 
8 /* 3. Exécuter la requête de récupération des données */
9 create TABLE SASDATASET as
10 select * from connection to impala
11 (SELECT * FROM db_name.tablename);
12 
13 /* Fermeture propre */
14 disconnect from impala;
15QUIT;

Warum funktioniert das? Indem Sie die SET-Anweisung trennen, ändern Sie die Umgebung der aktiven Impala-Sitzung. Wenn die folgende Abfrage (SELECT *) über connection to impala gesendet wird, profitiert sie von dieser Einstellung und ordnet die Spalten der Parquet-Datei korrekt nach ihrem Namen zu, was die Integrität der in SAS© abgerufenen Daten gewährleistet.