Lesen von und Schreiben in CSV-Dateien

Dieser Artikel enthält Beispiele für das Lesen und Schreiben in CSV-Dateien mit Azure Databricks bei Verwendung von Python, Scala, R und SQL.

Hinweis

Databricks empfiehlt die read_files-Tabellenwertfunktion für SQL-Benutzer, um CSV-Dateien zu lesen. read_files ist in Databricks Runtime 13.3 LTS und höher verfügbar.

Sie können auch eine temporäre Ansicht verwenden. Wenn Sie SQL verwenden, um CSV-Daten direkt zu lesen, ohne temporäre Ansichten oder read_files zu verwenden, gelten die folgenden Einschränkungen:

Optionen

Sie können mehrere Optionen für CSV-Datei-Datenquellen konfigurieren. Die unterstützten Optionen für Lesen und Schreiben finden Sie in den folgenden Apache Spark-Referenzartikeln.

Arbeiten mit fehlerhaften CSV-Einträgen

Beim Lesen von CSV-Dateien mit einem angegebenen Schema kann es vorkommen, dass die Daten in den Dateien nicht zum Schema passen. Beispielsweise kann ein Feld, das den Namen der Stadt enthält, nicht als ganze Zahl analysiert werden. Die Folgen hängen vom Modus ab, in dem der Parser ausgeführt wird:

  • PERMISSIVE (Standardeinstellung): NULL-Werte werden für Felder eingefügt, die nicht ordnungsgemäß analysiert werden konnten
  • DROPMALFORMED: Löscht Zeilen, die Felder enthalten, die nicht analysiert werden konnten
  • FAILFAST: Bricht das Lesen ab, wenn falsch formatierte Daten gefunden werden

Verwenden Sie zum Festlegen des Modus die mode-Option.

diamonds_df = (spark.read
  .format("csv")
  .option("mode", "PERMISSIVE")
  .load("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv")
)

Im Modus PERMISSIVE ist es möglich, die Zeilen, die nicht korrekt geparst werden konnten, mit einer der folgenden Methoden zu untersuchen:

  • Sie können einen benutzerdefinierten Pfad zur Option badRecordsPath um beschädigte Datensätze in einer Datei aufzuzeichnen.
  • Sie können die Spalte _corrupt_record dem Schema hinzufügen, das dem DataFrameReader bereitgestellt wird, um beschädigte Datensätze im resultierenden DataFrame zu überprüfen.

Hinweis

Die Option badRecordsPath hat Vorrang vor _corrupt_record, was bedeutet, dass fehlerhafte Zeilen, die in den angegebenen Pfad geschrieben werden, nicht im resultierenden DataFrame angezeigt werden.

Standardverhalten für falsch formatierte Datensätze ändert sich bei Verwendung der geretteten Datenspalte.

Notebook zum Suchen falsch formatierter Zeilen

Notebook abrufen

Spalte „Gerettete Daten“

Hinweis

Dieses Feature wird in Databricks Runtime 8.3 (nicht unterstützt) und höher unterstützt.

Wenn Sie den PERMISSIVE Modus verwenden, können Sie die Spalte für gerettete Daten aktivieren, um alle Daten zu erfassen, die nicht geparst wurden, weil eines oder mehrere Felder in einem Datensatz eines der folgenden Probleme aufweisen:

  • Fehlt im bereitgestellten Schema.
  • Stimmt nicht mit dem Datentyp des bereitgestellten Schemas überein.
  • Weist einen Fallkonflikt mit den Feldnamen im angegebenen Schema auf.

Die gerettete Datenspalte wird als JSON-Dokument zurückgegeben, das die geretteten Spalten und den Quelldateipfad des Datensatzes enthält. Um den Quelldateipfad aus der Spalte Gerettete Daten zu entfernen, können Sie die SQL-Konfiguration spark.conf.set("spark.databricks.sql.rescuedDataColumn.filePath.enabled", "false") festlegen. Sie können die gerettete Datenspalte aktivieren, indem Sie die Option rescuedDataColumn beim Lesen von Daten auf einen Spaltennamen setzen, z. B. _rescued_data mit spark.read.option("rescuedDataColumn", "_rescued_data").format("csv").load(<path>).

Der CSV-Parser unterstützt drei Modi beim Parsen von Datensätzen: PERMISSIVE, DROPMALFORMED und FAILFAST. Bei Verwendung mit rescuedDataColumn führen Datentypkonflikte nicht dazu, dass Datensätze im Modus DROPMALFORMED gelöscht werden oder im Modus FAILFAST einen Fehler auslösen. Nur beschädigte Datensätze, d. h. unvollständige oder falsch formatierte CSV-Dateien, werden verworfen oder führen zu Fehlern.

Wenn rescuedDataColumn der PERMISSIVE Modus verwendet wird, gelten die folgenden Regeln für beschädigte Datensätze:

  • Die erste Zeile der Datei (entweder eine Kopfzeile oder eine Datenzeile) legt die erwartete Zeilenlänge fest.
  • Eine Zeile mit einer anderen Anzahl von Spalten wird als unvollständig betrachtet.
  • Datentypübereinstimmungen werden nicht als beschädigte Datensätze betrachtet.
  • Nur unvollständige und falsch formatierte CSV-Datensätze werden als beschädigt betrachtet und in der Spalte _corrupt_record oder badRecordsPathaufgezeichnet.

SQL-Beispiel: CSV-Datei lesen

Im folgenden SQL-Beispiel wird eine CSV-Datei mit read_files gelesen.

-- mode "FAILFAST" aborts file parsing with a RuntimeException if malformed lines are encountered
SELECT * FROM read_files(
  's3://<bucket>/<path>/<file>.csv',
  format => 'csv',
  header => true,
  mode => 'FAILFAST')

Scala-, R- und Python-Beispiele: CSV-Datei lesen

Das folgende Notebook zeigt, wie Sie mit Scala, R und Python eine Datei lesen, Beispieldaten anzeigen und das Datenschema drucken können. Die Beispiele in diesem Abschnitt verwenden den Rauten-Datensatz. Geben Sie den Pfad zum Dataset sowie alle gewünschten Optionen an.

Notebook zum Lesen von CSV-Dateien

Notebook abrufen

Beispiel: Angeben des Schemas

Wenn das Schema der CSV-Datei bekannt ist, können Sie das gewünschte Schema für den CSV-Reader mit der schema-Option angeben.

Notebook zum Lesen von CSV-Dateien mit Schema

Notebook abrufen

SQL-Beispiel mit read_files:

SELECT * FROM read_files(
  's3://<bucket>/<path>/<file>.csv',
  format => 'csv',
  header => false,
  schema => 'id string, date date, event_time timestamp')

Beispiel: Häufige Schwierigkeiten beim Lesen einer Teilmenge von Spalten

Das Verhalten des CSV-Parsers hängt vom gelesenen Spaltensatz ab. Wenn das angegebene Schema falsch ist, können sich die Ergebnisse je nachdem, auf welche Teilmenge der Spalten zugegriffen wird, erheblich unterscheiden. Das folgende Notebook zeigt die häufigsten Schwierigkeiten.

Notebook zu Einschränkungen beim Lesen einer Teilmenge von Spalten einer CSV-Datei

Notebook abrufen