Čtení binárních souborů

Azure Databricks podporuje zdroj dat binárního souboru, který čte binární soubory a převádí každý soubor na jeden záznam obsahující nezpracovaný obsah a metadata souboru. Běžně se používá k načítání nestrukturovaných dat, jako jsou obrázky, audio nebo soubory PDF, pro následné zpracování nebo inferenci modelů strojového učení. Chcete-li číst binární soubory, zadejte zdroj format dat jako binaryFile.

Předpoklady

Azure Databricks nevyžaduje další konfiguraci pro použití binárních souborů.

Možnosti

Ke konfiguraci zdroje dat binárního souboru použijte metody .option() a .options() objektu DataFrameReader. Úplný seznam podporovaných možností najdete v referenčních informacích k možnostem rozhraní Spark API.

Výstupní schéma

Zdroj dat binárního souboru vytvoří datový rámec s následujícími sloupci a všemi sloupci oddílů:

  • path (StringType): Cesta k souboru.
  • modificationTime (TimestampType): Čas změny souboru. V některých implementacích Systému souborů Hadoop může být tento parametr nedostupný a hodnota by byla nastavena na výchozí hodnotu.
  • length (LongType): Délka souboru v bajtech.
  • content (BinaryType): Obsah souboru.

Usage

Následující příklady ukazují načítání binárních souborů pomocí rozhraní API datového rámce Sparku a SQL, filtrování podle typu souboru, zobrazení náhledů obrázků a uložení do tabulky Delta pro lepší výkon čtení.

Čtení binárních souborů

Pomocí rozhraní Apache Spark DataFrame API načtěte binární soubory do objektu DataFrame pro transformaci, zobrazení nebo následné zpracování.

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'
)

Konfigurace možností čtení

Pokud chcete načíst soubory s cestami odpovídajícími danému vzoru globu při zachování chování zjišťování oddílů, můžete použít tuto možnost pathGlobFilter. Následující kód načte všechny soubory JPG ze vstupního adresáře se zjišťováním oddílů:

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'
)

Pokud chcete ignorovat zjišťování oddílů a rekurzivně prohledávat soubory ve vstupním adresáři, použijte tuto recursiveFileLookup možnost. Tato možnost vyhledává prostřednictvím vnořených adresářů, i když jejich názvy nedodržují schéma pojmenování oddílů, jako je date=2019-07-01. Následující kód načte všechny soubory JPG rekurzivně ze vstupního adresáře a ignoruje zjišťování oddílů:

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
)

Načtení a zobrazení obrázků

Databricks doporučuje, abyste k načtení dat obrázků použili binární datový zdroj. Funkce Databricks display podporuje zobrazení dat obrázků načtených pomocí binárního zdroje dat.

Pokud mají všechny načtené soubory název souboru s příponou obrázku, je náhled obrázku automaticky povolen:

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'
)

náhled obrázku

Alternativně můžete funkci náhledu obrázku vynutit pomocí mimeType možnosti s řetězcovou hodnotou "image/*" pro přidání poznámek k binárnímu sloupci. Obrázky jsou dekódovány na základě informací o formátu v binárním obsahu. Podporované typy obrázků jsou bmp, gif, jpega png. Nepodporované soubory se zobrazují jako ikona poškozeného obrázku.

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/*'
)

Náhled obrázku s nepodporovaným typem souboru

Viz Referenční řešení pro aplikace obrázků pro doporučené pracovní postupy pro zpracování dat obrázků.

Uložit do tabulky Delta

Pokud chcete zvýšit výkon čtení při načítání dat zpět, Azure Databricks doporučuje ukládat data načtená z binárních souborů do tabulky Delta.

Python

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

Scala

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

Dodatečné zdroje

  • Čtení souborů obrázků: Pokud vaše úloha vyžaduje strukturovaná pole obrázků, jako je výška, šířka a data kanálu místo nezpracovaných bajtů, zdroj dat obrázku poskytuje dekódované schéma.