Odczytywanie plików binarnych

Azure Databricks obsługuje źródło danych plików binarnych, które odczytuje pliki binarne i konwertuje każdy plik na jeden rekord zawierający nieprzetworzonej zawartości i metadanych pliku. Jest on często używany do ładowania danych bez struktury, takich jak obrazy, audio lub pliki PDF do przetwarzania podrzędnego lub wnioskowania uczenia maszynowego. Aby odczytać pliki binarne, określ źródło format danych jako binaryFile.

Wymagania wstępne

Azure Databricks nie wymaga dodatkowej konfiguracji do korzystania z plików binarnych.

Opcje

Użyj metod .option() i .options() klasy DataFrameReader, aby skonfigurować źródło danych pliku binarnego. Aby uzyskać pełną listę obsługiwanych opcji, zobacz Dokumentacja opcji interfejsu API platformy Spark.

Schemat danych wyjściowych

Źródło danych plików binarnych tworzy obiekt DataFrame z następującymi kolumnami, a także wszelkimi kolumnami partycji:

  • path (StringType): ścieżka pliku.
  • modificationTime (TimestampType): czas modyfikacji pliku. W niektórych implementacjach systemu plików Hadoop ten parametr może być niedostępny, a wartość zostanie ustawiona na wartość domyślną.
  • length (LongType): długość pliku w bajtach.
  • content (BinaryType): zawartość pliku.

Usage

W poniższych przykładach pokazano ładowanie plików binarnych przy użyciu interfejsu API ramki danych platformy Spark i języka SQL, filtrowanie według typu pliku, wyświetlanie podglądów obrazów i zapisywanie w tabeli delty w celu zwiększenia wydajności odczytu.

Odczytywanie plików binarnych

Użyj interfejsu API ramki danych platformy Apache Spark, aby załadować pliki binarne do ramki danych na potrzeby przekształcania, wyświetlania lub przetwarzania podrzędnego.

Python

df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/")
display(df)

Scala

val df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/")
df.show()

SQL

SELECT path, length, modificationTime FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/images/',
  format => 'binaryFile'
)

Konfigurowanie opcji odczytu

Aby załadować pliki ze ścieżkami pasującymi do danego wzorca globu przy zachowaniu zachowania odnajdywania partycji, możesz użyć pathGlobFilter opcji . Poniższy kod odczytuje wszystkie pliki JPG z katalogu wejściowego z odnajdywaniem partycji:

Python

df = spark.read.format("binaryFile").option("pathGlobFilter", "*.jpg").load("/Volumes/<catalog>/<schema>/<volume>/images/")

Scala

val df = spark.read.format("binaryFile").option("pathGlobFilter", "*.jpg").load("/Volumes/<catalog>/<schema>/<volume>/images/")

SQL

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/images/',
  format => 'binaryFile',
  pathGlobFilter => '*.jpg'
)

Jeśli chcesz zignorować odnajdywanie partycji i cyklicznie przeszukiwać pliki w katalogu wejściowym recursiveFileLookup , użyj opcji . Ta opcja wyszukuje katalogi zagnieżdżone, nawet jeśli ich nazwy nie są zgodne ze schematem nazewnictwa partycji, takim jak date=2019-07-01. Poniższy kod odczytuje wszystkie pliki JPG rekursywnie z katalogu wejściowego i ignoruje odnajdywanie partycji:

Python

df = (spark.read.format("binaryFile")
  .option("pathGlobFilter", "*.jpg")
  .option("recursiveFileLookup", "true")
  .load("/Volumes/<catalog>/<schema>/<volume>/images/"))

Scala

val df = spark.read.format("binaryFile")
  .option("pathGlobFilter", "*.jpg")
  .option("recursiveFileLookup", "true")
  .load("/Volumes/<catalog>/<schema>/<volume>/images/")

SQL

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/images/',
  format => 'binaryFile',
  pathGlobFilter => '*.jpg',
  recursiveFileLookup => true
)

Ładowanie i wyświetlanie obrazów

Usługa Databricks zaleca użycie źródła danych pliku binarnego do załadowania danych obrazu. Funkcja Databricks display obsługuje wyświetlanie danych obrazów załadowanych przy użyciu binarnego źródła danych.

Jeśli wszystkie załadowane pliki mają nazwę pliku z rozszerzeniem obrazu, podgląd obrazu jest automatycznie włączony:

Python

df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/images/")
display(df)    # image thumbnails are rendered in the "content" column

Scala

val df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.show()

SQL

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/images/',
  format => 'binaryFile'
)

podgląd obrazu

Alternatywnie możesz wymusić funkcję podglądu obrazu, używając opcji mimeType z wartością ciągu "image/*", aby przypisać adnotację do kolumny binarnej. Obrazy są dekodowane w oparciu o informacje o formacie zawarte w zawartości binarnej. Obsługiwane typy obrazów to bmp, , gifjpegi png. Nieobsługiwane pliki są wyświetlane jako uszkodzona ikona obrazu.

Python

df = spark.read.format("binaryFile").option("mimeType", "image/*").load("/Volumes/<catalog>/<schema>/<volume>/images/")
display(df)

Scala

val df = spark.read.format("binaryFile").option("mimeType", "image/*").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.show()

SQL

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/images/',
  format => 'binaryFile',
  mimeType => 'image/*'
)

podgląd obrazu z nieobsługiwanym typem pliku

Zobacz Rozwiązanie referencyjne dla aplikacji obrazów dla zalecanego przepływu pracy do obsługi danych obrazów.

Zapisz do tabeli Delta

Aby zwiększyć wydajność odczytu podczas ładowania danych z powrotem, Azure Databricks zaleca zapisanie danych załadowanych z plików binarnych do tabeli delty.

Python

df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")

Scala

df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")

Dodatkowe zasoby

  • Odczytywanie plików obrazów: jeśli obciążenie wymaga pól obrazów strukturalnych, takich jak wysokość, szerokość i dane kanału, a nie nieprzetworzone bajty, źródło danych obrazu udostępnia zdekodowany schemat.